PHPで変数のクラス名からインスタンスを生成する

PHPで、あらかじめ変数に代入しているクラス名を使って、そのクラスのインスタンスを生成するにはどうすればよいか調べてみました。

きっと、そういう関数があるんだろうなあ、あるいはeval()すればできるだろうなあと思いつつ、なんとなく思い立った方法で試してみたらできてしまいました。

$class = 'Product';
$myProduct = new $class();

だめだと思ったらうまくいってしまったので、試しに次のようなこともしてみました。

$myProduct = new 'Product'();

これはだめでした。

メソッドでも試してみます。

$class = 'Product';
$method = 'getDetail';
$myProduct = new $class();
$class->$method();

上手くいきました。クラス名やメソッド名を文字列にした場合にはエラーが発生しました。

クラスメソッドはどうでしょう?

$class = 'Product';
$method = 'getDetail';
$class::$method();

エラーが発生しました。クラス名やメソッド名を文字列にした場合にもエラーが発生しました。

ついでに関数でも試してみます。

function product() {
    echo 'I am product().';
}

$func = 'product';
$func();
function product() {
    echo 'I am product().';
}

'product'();

どちらもエラーが発生しました。

関数やメソッドはcall_user_func()関数で呼び出せますし、やりたいことはできたのでいいのですが、どういう理由でこのような動作になるのかが気になります。PHPマニュアルを見ても、具体的な説明は見つかりませんでした。わかったのは、PHPでは()は関数呼び出し演算子ではないらしいということだけでした。

変数に代入しているのは単なる文字列なわけで、全ての例でエラーが発生してもおかしくないと思っていたので、上手くいく例があるのに驚きました。反対に、最初の例で成功するならば、2番目の例などでエラーが発生することを疑問に思うのは理解不足だからでしょうか?「PHPだから」とかいう理由ではないですよね?謎が残ります…。

コメント (1)

PHP 7.0.14なら上記の例でエラーを吐いていたものも正常に実行されますよ:)

コメントフォーム

トラックバック (1)

【PHP】Javaで言うClass#newInstanceみたいに、クラスを作成する

PHPでクラスを生成して、 それをどこかの関数かクラスに渡して、 その中でクラスのコピーを量産したい。 そんな状況が必要になりました。 単純にクラスをコピーする場合 // PHP5以上 $ne…

この記事のトラックバックURI
http://dxd8.com/archives/110/trackback/
この記事のURI
http://dxd8.com/archives/110/