1

私はhabrahabr.ruのいくつかの記事からこのコードを持っています:

abstract class Singleton {

    protected static $_instances = array();

    protected function __construct() {
    }

    public static function getInstance() {

            $class = \get_called_class();
            if ( !isset( static::$_instances[$class] ) )
                    static::$_instances[$class] = new static;

            return static::$_instances[$class];

    }

}

Auhtorは、たとえば、

class B extends Singleton {

    private $_a = 10;

}

しかし、この場合の「static」と「self」の主な違いを理解することはできません。たとえば、$ _ instancesをpublicとして定義し、次のような別のクラスを作成しようとした場合です。

class C extends Singleton {

    private $_z =  55;

}

シングルトンを抽象クラスではないものとして定義します。getInstanceを呼び出すたびに、どちらの場合も同じインスタンスの配列があります。static:: $_instancesとself::$ _ instances:

$s = Singleton::getInstance();

print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);

$b_instance = B::getInstance();

print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);

$c_instance = C::getInstance();

print_r(Singleton::$_instances);
print_r(B::$_instances);
print_r(C::$_instances);

anobodyは私を助けて、なぜ$ _instances配列が同じであるのか、そしてなぜ作者は自分自身ではなく静的を使用するのかを教えてくれますか?どうもありがとうございました、私の英語をごめんなさい。

4

1 に答える 1

2

すべてのクラスは、Singletonクラスに含まれる同じ静的配列$_instancesを共有します。著者が「新しい静的」を使用した理由。呼び出されたクラスのオブジェクトをその配列に格納することでした。配列は1つしかないため、Singletonクラス内からその配列をself::およびstatic::呼び出しすると、同じデータが返されます。

だから、明確にするために、あなたが呼ぶとき:

$b_instance = B::getInstance();

シングルトン内に格納されている$_instances配列にBのインスタンスが追加されています。静的な$_instancesプロパティをBまたはCクラスに追加した場合、新しく作成されたインスタンスが独自のクラスの静的な$ _instancesプロパティ内に格納されるという点で、動作が異なります。

于 2011-03-02T09:40:42.647 に答える