遊星ゲームズ
FrontPage | RSS


PHP new self()
 日記

 PHP5では「new self()」と書ける。ところがこれが罠で、親クラスの静的メソッドにこれを書くと、子クラスじゃなく親クラスをnewしようとするんである。
 まあそれ自体は考えてみればそうかもと思うけど、じゃあクラス名を取得する定数である__CLASS__ではどうかというと、これも親クラスの名前をもってくる。他に方法ないかと思っていろいろ調べたら

$trace = debug_trace();
$class = $trace$_lb0$_rb$_lb'class'$_rb

 なんてのを見つけた。ムリヤリもいいとこだけど(笑)
 PHP4ではこれでいいらしい。しかし、これもPHP5では親クラスの名前がとれてしまう。
 なんとなくnew child()とか書いてみてももちろんエラー。
 newされてるならclassname($this)でよさそうだけど、静的メソッドでは使えない。
 というわけで、静的メソッドが「呼び出されたクラス」を取得する方法はひとつもないらしい。たとえばシングルトンのテンプレートクラスを作るきれいな方法はないということになる。

 まあこれは、クラスを使う他の言語でもわりとそうっぽいけど。でもじゃあ__CLASS__ってなんに使うの?(笑)


PHP new self()を