Google

NAME="GENERATOR" CONTENT="Modular DocBook HTML Stylesheet Version 1.7">

第 14 章 クラスとオブジェクト

クラス

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

<?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 という名前のクラスを定義します。

注意

以下の注意書きはPHP 4に関するものです。

名前stdClassは、Zendにより内部的に使用され、保 存されています。PHPでstdClassという名前のクラ スを使用することはできません。

関数__sleepおよび__wakeupは、 PHPクラス内で使用される特殊な関数です。これらの関数に付随する特殊 な機能を使用する場合以外は、クラス内でこれらの名前を付けた関数を 使用することはできません。詳細な情報については、以下を参照下さい。

PHP は、__で始まる全ての関数名を特殊な関数として予約しています。 ドキュメントに記載された特殊関数の機能を使用する場合以外は、__を 有する関数名を使用しないことを推奨します。

注意 PHP 4では、変数varについては定数による初期化の みが可能です。定数以外で初期化を行う場合には初期化関数が必要です。 この初期化関数は、オブジェクトがクラスから構築される際に自動的に コールされます。このような関数はコンストラクタと呼ばれます。(以下 参照)

/* 以下のコードはPHP 4では動作しません。 */
class Cart
{
    var $todays_date = date("Y-m-d");
    var $name = $firstname;
    var $owner = 'Fred ' . 'Jones';
    var $items = array("VCR", "TV");
}

/* 以下に正しい方法を示します。 */
class Cart
{
    var $todays_date;
    var $name;
    var $owner;
    var $items;

    function Cart()
    {
        $this->todays_date = date("Y-m-d");
        $this->name = $GLOBALS['firstname'];
        /* 等など. . . */
    }
}

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

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

  $another_cart = new Cart;
  $another_cart->add_item("0815", 3);
?>

この例は、クラスCartのオブジェクト $cartおよび$another_cartを作成 します。$cartオブジェクトの関数 add_item()が商品番号10の商品一つが カートに追加されています。商品番号0815の商品3つが$another_cartに追 加されています。

$cart と $another_cartは共に関数 add_item()、 remove_item() と変数items を有しています。これらは、異なる関数およ び変数です。オブジェクトは、ファイルシステムのディレクトリに似たよ うなものであると考えられます。ファイルシステムでは、別のディレクト リに置く限り、二つの異なるREADME.TXTを保持することが可能です。ディ レクトリではトップディレクトリから各ファイルにアクセスするには、フ ルパス名を入力する必要がありますが、これと全く同様にコールしたい関 数の完全な名前を指定する必要があります。PHPの用語では、最上位のディ レクトリはグローバル名前空間であり、パス名のセパレータは、->と なります。つまり、$cart->items と $another_cart->items は、 二つの異なる変数です。$cart->items という名前の変数は、 $cart->$items ではない、つまり、PHPの変数名はドル記号を一つだけ 有することに注意して下さい。

// 正しい、$は一つ
$cart->items  = array("10" => 1); 

// $cart->$items は、$cart->"" になるため、正しくない。
$cart->$items = array("10" => 1);

// 正しいが、意図しているかどうかによらず、
// $cart->$myvar は、 $cart->items となる
$myvar = 'items';
$cart->$myvar = array("10" => 1);

クラス定義の内部では、プログラムでアクセス可能なオブジェクト名を知 ることはできません。Cartクラスが書かれている時点では、そのオブジェ クトが後で $cart という名前となるか $another_cart となるかはわかり ません。つまり、Cartクラスの中では $cart->items と書くことはで きないのです。代わりに、クラスの中からそのクラス内の関数や変数にア クセスするために、疑似変数 $this を使用することが可能です。$this は、「自分自身の」または「カレントのオブジェクト」と読み変えること ができます。つまり、'$this->items[$artnr] += $num' は、「同じクラ ス内の配列 items の $artnr カウンタに $num を追加する」または「カ レントオブジェクト内の配列 items の $artnr カウンタに $num を追加 する」と読み変えることが可能です。

注意 クラスとオブジェクトを処理する優れた関数がいくつかあります。 クラス/オブジェクト関数 をざっとみてみると良いでしょう。