3

シングルトンについては、http: //en.wikipedia.org/wiki/Singleton_pattern#PHP_5で説明されています。シングルトン クラスをスーパークラスとして使用し、シングルトンであるはずの他のクラスに拡張したいと考えています。問題は、スーパークラスがサブクラスではなく、それ自体のインスタンスを作成することです。スーパークラスにサブクラスのインスタンスを作成させる方法はありますか?

 class Singleton {

    // object instance
    private static $instance;

    protected function __construct() { }
    public function __clone() { }
    public function __wakeup() { }

    protected static function getInstance() {
        if (!self::$instance instanceof self) { 
            self::$instance = new self;

            if(self::$instance instanceof Singleton)
                echo "made Singleton object<br />";

            if(self::$instance instanceof Text)
                echo "made Test object<br />";
        }
        return self::$instance;
    }

}


class Test extends Singleton {

    private static $values=array();

    protected function load(){
        $this->values['a-value'] = "test";
    }

    public static function get($arg){
        if(count(self::getInstance()->values)===0)
            self::getInstance()->load();

        if(isset(self::getInstance()->values[$arg]))
            return self::getInstance()->values[$arg];

        return false;
    }
}
4

2 に答える 2

4

これはPHPの制限です。親クラスは、そのメソッドが静的に呼び出されるサブクラスの名前を判別できません。

PHP 5.3は、レイトスタティックバインディングをサポートするようになりました。これにより、必要なことを実行できるようになりますが、それが広く利用できるようになるまでにはしばらく時間がかかります。ここでいくつかの情報を参照してください

考えられる回避策について読む価値があるかもしれないいくつかの同様の質問がここにあります、例えばこれは

于 2008-11-30T22:10:48.200 に答える
1

静的メソッドは、インスタンスではなく、その定義型に関連付けられています。子クラスは静的メソッドを継承しません (意味がありません)。それらはまだ親タイプに関連付けられています。したがって、親タイプに関連付けられている GET メソッドには、取得したいサブタイプの種類を判別する方法がありません。残念ながら、子クラスごとに独自の GET メソッドを実装するだけで済みます。

于 2008-11-30T21:36:25.380 に答える