PHP継承に問題があります。ここで契約です:PHPのシングルトンと継承
私はこの基本クラス、シングルトンを持っている:
namespace My_Namespace;
abstract class Singleton {
protected static $instance = null;
static function get() {
if (null == static::$instance) {
static::$instance = new static;
}
return static::$instance;
}
private function __construct() {
}
}
私はシングルトンクラスは、A、B、C、D、それらを呼び出すことを継承したクラスの束を持っています。そのうちの一つは、次のようになります。今
namespace My_Namespace;
class A extends Singleton {
protected function __construct() {
B::get();
if (some_condition()) {
C::get();
}
else {
D::get();
}
}
}
、私はちょうどそれがすべての転がりを得るためにA::get()
を行います。 Aのコンストラクタは、期待通りに呼び出されます。次に、Bのコンストラクタが呼び出され、問題はありません。今それは変だ。 C::get()
が呼び出されると、既にクラスBのオブジェクトとしてstatic::$instance
が認識され、Cをインスタンス化しません。 Bの__construct
がC::get
またはD::get
を呼び出しているが、それが私の目的には最適ではないことがわかっている。それはそれらが同じ範囲にあることによって引き起こされるのでしょうか?もしそうなら、これを回避する方法はありますか?実用目的ではなく好奇心をもっと求めています。私は、それぞれのシングルトンパターンを簡単に実装できることを知っています。だから、どんなアイデアですか?ありがとう!
P.S. 「シングルトンは悪ではなく、あなたは地獄で燃えるべきです」というコメントはしないでください。私はそれを完全によく知っています。
+1のために地獄のコメントで焼く – phpisuber01
私は、継承されたクラスにインスタンスを押し込む静的なプロパティが必要だと思うので、 'protected static $ instance = null;'をサブクラスに追加してください。 – Orangepill
@Orangepillあなたはそれを持っています。私はその行を追加し、それはすべて期待どおりに動作します。 'しかし、それはシングルトンのクラス全体と継承のものを役に立たなくしてしまいます...そのアイデアは、そのクラスにシングルトンの機能を入れさせることでした。それはまったく可能ですか? –