PHPの勉強9 抽象クラス

最終更新:2006/06/26

トップページへ戻る
前へ 次へ
●抽象クラスの作成
    ・抽象クラスは以下のものを持つことができます。
      フィールド
      コンストラクタ
      抽象メソッド
      具象メソッド

    ・構文
      [抽象クラス]
        abstract class クラス名 {
        }
      [抽象メソッド]
        abstract メソッド名(引数);

      ファイル名はProduct.phpで保存してください。
<?php
// 抽象商品クラス
abstract class AbstractProduct {
    private $code;    // 商品コード
    private $name;    // 商品名
    private $price;   // 商品定価

    // 商品コードの値を設定
    public function setCode($code) {
        $this->code = $code;
    }

    // 商品コードの値を取得
    public function getCode() {
        return $this->code;
    }

    // 商品名に値を設定
    public function setName($name) {
        $this->name = $name;
    }

    // 商品名の値を取得
    public function getName() {
        return $this->name;
    }

    // 商品定価に値を設定
    public function setPrice($price) {
        $wrkprice = $price;
        if (is_string($wrkprice) == true) {
          $wrkprice = intval($wrkprice);
        }

        if ($wrkprice < 0) {
            $this->price = 0;
            return;
        }
        $this->price = $wrkprice;
    }

    // 商品定価の値を取得
    public function getPrice() {
        return $this->price;
    }
}

// 商品クラス
class Product extends AbstractProduct {
    // コンストラクタ
    function __construct($code, $name, $price) {
        $this->setCode($code);
        $this->setName($name);
        $this->setPrice($price);
    }
}

// 割引商品クラス
class DiscountProduct extends Product {

     // プロパティ

    private $discount;    // 商品割引率

    // コンストラクタ
    function __construct($code, $name, $price, $discount) {
        parent::__construct($code, $name, $price);
        $this->setDiscount($discount);
    }

    // メソッド

    // 商品値引率に値を設定します。
    public function setDiscount($discount) {
        if ( $discount < 0 || $discount > 100 ) {
            $this->discount = 0;
            return;
        }
        $this->discount = $discount;
    }

    // 商品値引率の値を取得
    public function getDiscount() {
        return $this->discount;
    }

    // 商品の売値を取得
    public function getPrice() {
        return (int)(parent::getPrice() * (1 - $this->discount / 100.0));
    }
}

// セット商品クラス
class SetProduct extends AbstractProduct {
    private $discount;                // セット商品割引率
    private $products;                // セット商品リスト

    // コンストラクタ
    function __construct($code, $name, $discount, $products) {
        $this->setCode($code);
        $this->setName($name);
        $this->setDiscount($discount);
        $this->setProducts($products);
    }

    // 商品の売値を取得
    public function getPrice() {
        $price = 0;
        for($i = 0; $i < count($this->products); $i++) {
            $price += $this->products[$i]->getPrice();
        }
        return (int)($price * (1 - $this->discount / 100.0));
    }

    // 商品割引率に設定
    public function setDiscount($discount) {
        if($discount < 10 || $discount > 100) {
            $this->discount = 0;
            return;
        }
        $this->discount = $discount;
    }

    // 商品割引率を取得
    public function getDiscount() {
        return $this->discount;
    }

    // 商品配列に値を設定
    public function setProducts($products) {
        $this->products = $products;
    }
}
?>

●動作確認

      ファイル名はsample031.phpで保存してください。
<html>
<head>
<title>SAMPLE031</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
<?php
require_once("Product.php");

$p[0] = new DiscountProduct('0001','PHP基礎編',10000,20);
$p[1] = new Product('0002','Smarty編',20000);
$p[2] = new DiscountProduct('0003','中級実務編',30000,10);
$p[3] = new Product('0004','セキュリティ編',40000);

for ($i = 0; $i < count($p); $i++ ) {
    print ' code = ' . $p[$i]->getCode() . '<br>';
    print ' name = ' . $p[$i]->getName() . '<br>';
    print ' price = ' . $p[$i]->getPrice() . '<br>';
}

$s = new SetProduct('SET01','PHPマスターコース',10,$p);
print ' code = ' . $s->getCode() . '<br>';
print ' name = ' . $s->getName() . '<br>';
print ' price = ' . $s->getPrice() . '<br>';
?>
</body>
</html>
トップページへ戻る
前へ 次へ
Copyright© 2005- Naoyuki Sano. All rights reserved.