PHP マニュアル
前のページ |  | 次のページ

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

警告

複数のファイルや複数のPHPブロックで分割してクラスを定義定義することは できません。以下の例は動作しません。

    <?php
    class test {
    ?>
    <?php
        function test() {
            print 'OK';
        }
    }
    ?>

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

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

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

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

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

`<?php
class Cart
{
/* 以下のコードはPHP 4では動作しません。 */
var $todays_date = date("Y-m-d");
var $name = $firstname;
var $owner = 'Fred ' . 'Jones';
/* Arrays containing constant values will, though. */
var $items = array("VCR", "TV");
}
/* 以下に正しい方法を示します。 */
class Cart
{
var $todays_date;
var $name;
var $owner;
var $items = array("VCR", "TV");
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 を 追加する」と読み変えることが可能です。

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

前のページ | ホーム | 次のページ
内部（ビルトイン）関数 | 上に戻る | extends