PHPの勉強8 クラス、継承 [PHP5]

最終更新:2006/04/10

トップページへ戻る
前へ 次へ

●クラス

    ・クラス

      クラスとは、オブジェクトの設計図にあたる部分です。
      実際のプログラミングでは、クラスを基に「インスタンス」を生成します。
      PHP5からは、データの隠蔽、例外処理、private / protected / public、try〜catch、throw、
      デストラクタを利用できるようになりました。

    ・プロパティ

       オブジェクト内に保持する変数を定義するものです。
       PHP5からアクセス修飾子のprivate / protected / publicが使用可能になりました。

    ・$this変数について

       自身のオブジェクトを指します。$this変数を使うことによって、プロパティとローカル変数を
       明確に区別することができます。

    ・メソッド

      メソッドは、オブジェクトを操作するものです。
      PHP5からアクセス修飾子のprivate / protected / publicが使用可能になりました。
      通常の関数との違いは以下の通りです。

      ・クラススコープを持つ
      ・オブジェクト自身を指す$this変数が定義されている。
      ・アクセスするには、オブジェクト経由または「クラス名::メソッド名]の文法を利用する。

    ・コンストラクタ

      オブジェクトを生成する時点で、オブジェクトに対する初期処理を行うことができます。
      PHP5からコンストラクタの宣言方法が変更になりました。

    ・デストラクタ

      オブジェクトが消滅する際に自動的に呼ばれます。

    ・継承

      既存のクラスをもとに新しいクラスを定義することができます。
      ただし、多重継承はサポートしていません。

    ・標準的なクラスの記述は、以下のようになります。

      class [クラス名] extends [親クラス名] {

          // プロパティ
          [アクセス修飾子] [変数名];

          // コンストラクタ
          function __construct (引数) {
              処理;
          }

          // デストラクタ
          function __destructor (引数) {
              処理;
          }

          // メソッド
          [アクセス修飾子] function [メソッド名] (引数) {
              処理;
          }
      }
<html>
<head>
<title>SAMPLE029</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
<?php
// 商品クラス
class Product {

     // プロパティ

     private $code;        // 商品コード
     private $name;        // 商品名
     private $price = 0;   // 商品定価

    // コンストラクタ
    function __construct($code, $name, $price) {
        $this->setCode($code);
        $this->setName($name);
        $this->setPrice($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) {
        if ( $price < 0 ) {
            $this->price = 0;
            return;
        }
        $this->price = $price;
    }

    // 商品定価の値を取得
    public function getPrice() {
        return $this->price;
    }
}
// インスタンス生成
$p1 = new Product('0001','日経ソフトウェア',980);
$p2 = new Product('0002','日経SYSTEMS',1300);
$p3 = new Product('0003','日経NETWORK',1200);

print ' code = ' . $p1->getCode() . '<br>';
print ' name = ' . $p1->getName() . '<br>';
print ' price = ' . $p1->getPrice() . '<br>';

print ' code = ' . $p2->getCode() . '<br>';
print ' name = ' . $p2->getName() . '<br>';
print ' price = ' . $p2->getPrice() . '<br>';

print ' code = ' . $p3->getCode() . '<br>';
print ' name = ' . $p3->getName() . '<br>';
print ' price = ' . $p3->getPrice() . '<br>';
?>
</body>
</html>


●継承

    あるクラスをベースにして、そのクラスの機能を拡張して新たなクラスを作る仕組みです。
    PHPでは、単一継承のみをサポートしています。
<html>
<head>
<title>SAMPLE030</title>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
</head>
<body>
<?php
// 商品クラス
class Product {

     // プロパティ

     private $code;        // 商品コード
     private $name;        // 商品名
     private $price = 0;   // 商品定価

    // コンストラクタ
    function __construct($code, $name, $price) {
        $this->setCode($code);
        $this->setName($name);
        $this->setPrice($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) {
        if ( $price < 0 ) {
            $this->price = 0;
            return;
        }
        $this->price = $price;
    }

    // 商品定価の値を取得
    public function getPrice() {
        return $this->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)(Product::getPrice() * (1 - $this->discount / 100.0));
    }
}

$p1 = new DiscountProduct('0001','日経ソフトウェア',980,0);
$p2 = new DiscountProduct('0002','日経SYSTEMS',1300,10);
$p3 = new DiscountProduct('0003','日経NETWORK',1200,30);

print ' code = ' . $p1->getCode() . '<br>';
print ' name = ' . $p1->getName() . '<br>';
print ' price = ' . $p1->getPrice() . '<br>';
print ' discount = ' . $p1->getDiscount() . '<br>';

print ' code = ' . $p2->getCode() . '<br>';
print ' name = ' . $p2->getName() . '<br>';
print ' price = ' . $p2->getPrice() . '<br>';
print ' discount = ' . $p2->getDiscount() . '<br>';

print ' code = ' . $p3->getCode() . '<br>';
print ' name = ' . $p3->getName() . '<br>';
print ' price = ' . $p3->getPrice() . '<br>';
print ' discount = ' . $p3->getDiscount() . '<br>';
?>
</body>
</html>
トップページへ戻る
前へ 次へ
Copyright© 2005- Naoyuki Sano. All rights reserved.