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
" \t function $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

目次
call_user_method_array  -- パラメータの配列を指定してユーザメソッドをコールする[古い関数]
call_user_method  -- 指定したオブジェクトのユーザーメソッドをコールする[古い関数]
class_exists  -- クラスが定義済か確認する
get_class_methods  -- クラスメソッドの名前を取得する
get_class_vars  -- クラスのデフォルトプロパティを取得する
get_class  -- オブジェクトのクラス名を返す
get_declared_classes  -- 定義済のクラスの名前を配列として返す
get_declared_interfaces  -- 宣言されている全てのインターフェースの配列を返す
get_object_vars  -- オブジェクトのプロパティを取得する
get_parent_class  -- オブジェクトの親クラスの名前を取得する
interface_exists  -- インターフェースが宣言されているかどうかを確認する
is_a  -- オブジェクトがこのクラスのものであるか、このクラスをその親クラスのひとつとしているかどうかを調べる
is_subclass_of  -- あるオブジェクトが指定したクラスのサブクラスに属するかどうかを調べる
method_exists  -- クラスメソッドが存在するかどうかを確認する
property_exists  --  オブジェクトもしくはクラスにプロパティが存在するかどうかを調べる