章 13. クラスとオブジェクト

目次
クラス

クラス

クラスは、変数およびこれらの変数で動作する関数の集まりです。 クラスは次のような構文により定義されます。


 <?php
 class Cart {
     var $items;  // 買い物篭の中のアイテム
   
     // $num 個の $artnr を買い物篭に加えます
 
     function add_item ($artnr, $num) {
         $this->items[$artnr] += $num;
     }
   
     // $num 個の $artnr を買い物籠から出します
 
     function remove_item ($artnr, $num) {
         if ($this->items[$artnr] > $num) {
             $this->items[$artnr] -= $num;
             return true;
         } else {
             return false;
         }   
     }
 }
 ?>
      

この例は、籠の中の物と籠にアイテムを加えたり除いたりする二つの関数への 連想配列からなる Cart という名前のクラスを定義します。

クラスは型、つまり、実際の変数の雛型です。 new 演算子により所望の型の変数を作成する必要があります。


 $cart = new Cart;
 $cart->add_item("10", 1);
     

この例は、クラス Cart のオブジェクト $cart を作成します。 オブジェクトの関数 add_item() が番号10 の物を籠に加えるためにコールされ ています。

クラスは、他のクラスを拡張することにより作成することができます。 拡張または派生クラスは、基底クラスの全ての変数と関数、そして、 拡張する際の定義により加えられたものを保持しています。 この定義は、extends キーワードにより行なうことができます。 多重継承はサポートされていません。


 class Named_Cart extends Cart {
     var $owner;
  
     function set_owner ($name) {
         $this->owner = $name;
     }
 }
     

この例は、Cart の全ての変数及び関数に加えて変数 $owner と 関数 $set_owner を保持するクラス Named_Cart を定義しています。 この定義により、名前付きの籠を通常の手段で作成し、籠の保有者を 設定したり得たりすることができます。 名前付きの籠で元の籠クラスの関数を使うことも可能です。


 $ncart = new Named_Cart;    // 名前付きの籠を作成
 $ncart->set_owner ("kris"); // 籠の所有者の名前を設定
 print $ncart->owner;        // 籠の所有者を出力
 $ncart->add_item ("10", 1); // (籠から継承された機能)
     

クラスにおける関数の中では、変数 $this はそのオブジェクト自身を意味します。 オブジェクトの中では、何らかのクラス変数や関数にアクセスしたい場合に $this->something を使う必要があります。

コンストラクタは、クラスの新しいインスタンスを作成する際に 自動的にコールされるクラス関数です。 関数は、クラスと同じ名前を有する際にコンストラクタとなります。


 class Auto_Cart extends Cart {
     function Auto_Cart () {
         $this->add_item ("10", 1);
     }
 }
     

この例は、Cart にコンストラクタを加えたクラス Auto_Cart を定義しています。 このコンストラクタは、"new" により新しい Auto_Cart が作成される度に 籠に 10 番の物を一つ保持するように初期化します。 コンストラクタは、オプションとして引数をとります。 これにより、コンストラクタは非常に便利なものとなります。


 class Constructor_Cart extends Cart {
     function Constructor_Cart ($item = "10", $num = 1) {
         $this->add_item ($item, $num);
     }
 }
 
 // Shop the same old boring stuff.
 
 $default_cart   = new Constructor_Cart;
 
 // Shop for real...
 
 $different_cart = new Constructor_Cart ("20", 17);
     

注意

派生クラスの場合、派生クラスのコンストラクタがコールされた時にも 親クラスのコンストラクタが自動的にコールされるということはありません。