以下の関数により、クラスやインスタンスオブジェクトに関する情報を
得ることが可能となります。オブジェクトが属するクラスの名前、その
メンバープロパティ、メソッドを取得可能です。
この関数を使用することにより、オブジェクトのクラスメンバーだけで
なく親クラス(すなわちそのオブジェクトクラスの派生元)の情報を得る
ことも可能です。
これらの関数は、標準モジュールの一部として利用可能であり、常に使用できます。
これらの関数はPHPコアに含まれるため、使用す
る際にインストールは不要です。
この拡張モジュールは設定ディレクティブを全く定義しません。
この拡張モジュールはリソース型を全く定義しません。
この例では、まず基底クラスおよびそのクラスの派生クラスを定義しま
す。基底クラスは食用か否か、色とかいった、一般的な野菜を記述しま
す。サブクラスSpinachはその野菜の料理法と調理
済であるかどうかの情報を追加します。
例 1. classes.inc
<?php
// メンバープロパティとメソッドを有する基底クラス class Vegetable {
var $edible; var $color;
function Vegetable( $edible, $color="green" ) { $this->edible = $edible; $this->color = $color; }
function is_edible() { return $this->edible; }
function what_color() { return $this->color; } } // クラスVegetableの終り
// 基底クラスを拡張する class Spinach extends Vegetable {
var $cooked = false;
function Spinach() { $this->Vegetable( true, "green" ); }
function cook_it() { $this->cooked = true; }
function is_cooked() { return $this->cooked; } } // クラスSpinachの終り
?>
|
|
続いて、これらのクラスから二つのオブジェクトのインスタンスを作成し、
親クラスを含む情報を出力します。
また、いくつかのユーティリティ関数を定義します。これらは主に変数
を格好良く表示するためのものです。
例 2. test_script.php
<pre> <?php
include "classes.inc";
// ユーティリティ関数
function print_vars($obj) { $arr = get_object_vars($obj); while (list($prop, $val) = each($arr)) echo "\t$prop = $val\n"; }
function print_methods($obj) { $arr = get_class_methods(get_class($obj)); foreach ($arr as $method) echo "\tfunction $method()\n"; }
function class_parentage($obj, $class) { global $$obj; if (is_subclass_of($$obj, $class)) { echo "Object $obj belongs to class ".get_class($$obj); echo " a subclass of $class\n"; } else { echo "Object $obj does not belong to a subclass of $class\n"; } }
// 二つのオブジェクトのインスタンスを作成
$veggie = new Vegetable(true,"blue"); $leafy = new Spinach();
// オブジェクトに関する情報を出力 echo "veggie: CLASS ".get_class($veggie)."\n"; echo "leafy: CLASS ".get_class($leafy); echo " PARENT ".get_parent_class($leafy)."\n";
// veggieのプロパティを表示 echo "\nveggie: プロパティ\n"; print_vars($veggie);
// そしてleafyのメソッドを表示 echo "\nleafy: メソッド\n"; print_methods($leafy);
echo "\nParentage:\n"; class_parentage("leafy", "Spinach"); class_parentage("leafy", "Vegetable"); ?> </pre>
|
|
注意すべき大事な点ですが、上記の例ではオブジェクト
$leafyは
Vegetableのサブクラスであるクラス
Spinachのインスタンスであり、
このスクリプトの最後の部分は以下のような出力となります。