Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2002/04/02

counter hits
since 1999/11/06


PHP4のクラスとJavaのクラス - オブジェクトの動的生成

PHP4からオブジェクト指向的な機能・動作が改善されていますが、オブジェクト指向言語であるJavaとどの程度挙動が異なるか、ちょっとずつまとめてみようかと思います。基本的には、PHPマニュアルに記載されていなくて、「どうなるの?」と思ったことを主にやっています。

今回は、「オブジェクトの動的生成」についてです。

Stringなクラス名を指定してインスタンスを得る場合、Javaでは「Class.forName(クラス名).newInstance()」な感じですが、PHPでは。。。いやー。特別な関数とか、いらないんです。単純に、クラス名が代入された変数を使って「$変数名()」でOKです。ついでに、メソッドも同様の手順でコールできます。通常の(?)関数の場合と同じですね。

以下、サンプルです。

●forNameTest.php

<?php
class ClassA
{
    function ClassA()
    {
        echo "コンストラクタが呼ばれました<br>";
    }

    function method1()
    {
        echo "method1が呼ばれました<br>";
    }

    function method2($param)
    {
        echo "method2が引数「" . $param . "」で呼ばれました。<br>";
    }
}

/**
 * オブジェクトを動的に作る。大文字小文字は区別しない。
 */
$className = "classa";
$obj = new $className();
$obj->method1();

/**
 * メソッドを動的に呼び出してみる。やはり大文字小文字は区別しない。
 * 引数がありデフォルト値が設定されていない場合、指定しないとWarningが出る
 */
$methodName = "METHOD2";
$obj->$methodName("ほげ");
?>

●出力結果
コンストラクタが呼ばれました
method1が呼ばれました
method2が引数「ほげ」で呼ばれました。 

次に、staticなメソッドを呼び出す場合、インスタンスメソッドの場合とは異なり、実行時にparse errorになってしまいます。で、どうするかというと、eval関数を使えばOKです。以下、サンプルです。

●forNameTest2.php

<?php
class classA
{
    function execute()
    {
        echo("classA<br>");
    }
}

class classB
{
    function createNG($n)
    {
        // parse errorになる
//        $n::execute();
    }

    function createOK($n)
    {
        eval("$n::execute();");
    }
}
?>
<?php
    $a = new classB();

    // 当然ながらOK
    classA::execute();

    // これもOK
    $a->createOK("classA");
?>

●出力結果
classA
classA 


About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2002 by Hideyuki SHIMOOKA all rights reserved.