|
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();
$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)
{
}
function createOK($n)
{
eval("$n::execute();");
}
}
?>
<?php
$a = new classB();
classA::execute();
$a->createOK("classA");
?>
●出力結果
classA
classA
|