旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[PHP] 静的なメソッドを継承した時の問題

2008年3月11日

PHP4でもあった問題ですが、PHP5でもそのままだった
とりあえずコードと実行結果

コード

<?php
class SuperClass {
public static function getInstance() {
static $instance = null;
if ($instance === null) $instance = new self;
return $instance;
}
}
class SubClass extends SuperClass {
}
$i = SubClass::getInstance();
var_dump($i);

実行結果

object(SuperClass)#1 (0) {
}

と、$i は SubClassのインスタンスであって欲しかったんですけど
SuperClassのインスタンスになってしまっている

つまり
静的なメソッドを継承した場合、サブクラスのメソッドとして呼んでも
selfキーワードはスーパークラスを指してしまう。
なお、__CLASS__もスーパークラスを指す。(__CLASS__についてはPHP4もそうだった)

・・・なんで、このSingleton(っぽい)パターンは失敗しているんで
対処しなくちゃいけないんですけど

public static function getInstance() {
// SuperClass::getInstanceを_付きにリネームして
// クラス名を引数に取るようにしてあるものとする
return parent::_getInstance(__CLASS__);
}

まー、これを各クラスに書けばいいやってんで0.2秒で妥協

あ、すぐ妥協したのは別にPHPだからってんじゃなくて
最近は言語別の文化を覚えることに少々疑問を感じているからです

number_formatを使うなら、
3桁区切りでカンマを入れるアルゴリズムを残して
どの環境でもすぐに引き出せるようにした方がいいんじゃないか、的な
(この関数使えよ!ってのは、概ね他の人が(教え|怒っ)てくれるし)