XII. クラス/オブジェクト関数
以下の関数により、クラスやインスタンスオブジェクトに関する情報を
得ることが可能となります。オブジェクトが属するクラスの名前、その メンバープロパティ、メソッドを取得可能です。
この関数を使用することにより、オブジェクトのクラスメンバーだけで
なく親クラス(すなわちそのオブジェクトクラスの派生元)の情報を得る ことも可能です。
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)
{
foreach
(get_object_vars($obj)
as $prop => $val) {
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)
{
if
(is_subclass_of($GLOBALS[$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のインスタンスであり、
このスクリプトの最後の部分は以下のような出力となります。
[...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable
|
|
|
|