Google

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

IXクラス/オブジェクト関数

導入

概要

以下の関数により、クラスやインスタンスオブジェクトに関する情報を 得ることが可能となります。オブジェクトが属するクラスの名前、その メンバープロパティ、メソッドを取得可能です。 この関数を使用することにより、オブジェクトのクラスメンバーだけで なく親クラス(すなわちそのオブジェクトクラスの派生元)の情報を得る ことも可能です。

使用例

この例では、まず基底クラスおよびそのクラスの派生クラスを定義しま す。基底クラスは食用か否か、色とかいった、一般的な野菜を記述しま す。サブクラスspinachはその野菜の料理法と調理 済であるかどうかの情報を追加します。

例 1classes.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-&gt;cooked;
	}
	
} // クラスSpinachの終り

?>

続いて、これらのクラスから二つのオブジェクトのインスタンスを作成し、 親クラスを含む情報を出力します。 また、いくつかのユーティリティ関数を定義します。これらは主に変数 を格好良く表示するためのものです。

例 2test_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>

注意すべき大事な点ですが、上記の例ではオブジェクト $leafyVegetableのサブクラスであるクラス Spinachのインスタンスであり、 このスクリプトの最後の部分は以下のような出力となります。

[...]
Parentage:
Object leafy does not belong to a subclass of Spinach
Object leafy belongs to class spinach a subclass of Vegetable

目次
call_user_method_array --  パラメータの配列を指定してユーザメソッドをコールする
call_user_method --  指定したオブジェクトのユーザーメソッドをコールする
class_exists -- クラスが定義済か確認する
get_class_methods -- クラスメソッドの名前を連想配列として返す
get_class_vars --  クラスのデフォルトプロパティを配列として返す
get_class -- オブジェクトのクラス名を返す
get_declared_classes -- 定義済のクラスの名前を配列として返す
get_object_vars -- オブジェクトプロパティを配列として返す
get_parent_class -- オブジェクトの親クラスの名前を返す
is_a --  Returns TRUE if the object is of this class or has this class as one of its parents
is_subclass_of --  あるオブジェクトが指定したクラスのサブクラスに属するかどうかを調 べる
method_exists -- クラスメソッドが存在するかどうかを確認する