PHP5では「new self()」と書ける。ところがこれが罠で、親クラスの静的メソッドにこれを書くと、子クラスじゃなく親クラスをnewしようとするんである。
まあそれ自体は考えてみればそうかもと思うけど、じゃあクラス名を取得する定数である__CLASS__ではどうかというと、これも親クラスの名前をもってくる。他に方法ないかと思っていろいろ調べたら
$trace = debug_trace();
$class = $trace$_lb0$_rb$_lb'class'$_rb
なんてのを見つけた。ムリヤリもいいとこだけど(笑)
PHP4ではこれでいいらしい。しかし、これもPHP5では親クラスの名前がとれてしまう。
なんとなくnew child()とか書いてみてももちろんエラー。
newされてるならclassname($this)でよさそうだけど、静的メソッドでは使えない。
というわけで、静的メソッドが「呼び出されたクラス」を取得する方法はひとつもないらしい。たとえばシングルトンのテンプレートクラスを作るきれいな方法はないということになる。
まあこれは、クラスを使う他の言語でもわりとそうっぽいけど。でもじゃあ__CLASS__ってなんに使うの?(笑)