PHPの勉強7 クラス、継承 [PHP4]

最終更新:2005/11/29

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

●クラス

    ・クラス

      クラスとは、オブジェクトの設計図にあたる部分です。
      実際のプログラミングでは、クラスを基に「インスタンス」を生成します。
      クラスの構成要素には「プロパティ(クラス変数)」、「メソッド(メンバー関数)」、「コンストラクタ」があります。

    ・プロパティ(クラス変数)

       オブジェクト内に保持する変数を定義するものです。

    ・$this変数について

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

    ・メソッド(メンバー関数)

      メソッドは、オブジェクトを操作するものです。
      通常の関数との違いは以下の通りです。

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

    ・コンストラクタ

      オブジェクトを生成する時点で、オブジェクトに対する初期処理を行うことができます。
      コンストラクタの宣言には、必ずクラス名を使います。

    ・継承

      既存のクラスをもとに新しいクラスを定義することができます。

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

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

          // プロパティ
          var [変数名];

          // コンストラクタ
          [クラス名] (パラメータ) {
              処理;
          }

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

     // プロパティ

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

    // コンストラクタ

    function Product($code, $name, $price) {
        $this->setCode($code);
        $this->setName($name);
        $this->setPrice($price);
    }

    // メソッド

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

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

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

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

    // 商品定価に値を設定
    function setPrice($price) {
        if ( $price < 0 ) {
            $this->price = 0;
            return;
        }
        $this->price = $price;
    }

    // 商品定価の値を取得
    function getPrice() {
        return $this->price;
    }
}
// インスタンス生成
$p1 = new Product("0001","日経ソフトウェア",980);
$p2 = new Product("0002","日経システム構築",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>
       ※ファイル保存時の文字コードは「EUC-JP」にしてください。
       sample027の実行結果


●継承

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

     // プロパティ

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

    // コンストラクタ

    function Product($code, $name, $price) {
        $this->setCode($code);
        $this->setName($name);
        $this->setPrice($price);
    }

    // メソッド

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

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

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

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

    // 商品定価に値を設定
    function setPrice($price) {
        if ( $price < 0 ) {
            $this->price = 0;
            return;
        }
        $this->price = $price;
    }

    // 商品定価の値を取得
    function getPrice() {
        return $this->price;
    }
}
// 割引商品クラス
class DiscountProduct extends Product {

     // プロパティ

    var $discount;    // 商品割引率

    // コンストラクタ

    function DiscountProduct($code, $name, $price, $discount) {
        $this->Product($code, $name, $price);
        $this->setDiscount($discount);
    }

    // メソッド

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

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

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

$p1 = new DiscountProduct("0001","日経ソフトウェア",980,0);
$p2 = new DiscountProduct("0002","日経システム構築",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>
       ※ファイル保存時の文字コードは「EUC-JP」にしてください。
       sample028の実行結果
トップページへ戻る
前へ 次へ
Copyright© 2005- Naoyuki Sano. All rights reserved.