单身人士PHP后期静态绑定

我从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;

}

但在这种情况下,我无法理解“静态”和“自我”之间的主要区别:例如,如果我们将$ _instances定义为public,并尝试创建另一个类

class C extends Singleton {

    private $_z =  55;

}

并将Singleton定义为不是抽象类,在每次调用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);

一个人可以帮助我告诉我,为什么$ _instances数组是相同的,为什么作者使用静态而不是自我? 非常感谢,对不起我的英文。


所有这些类共享Singleton类中包含的相同的静态数组$ _instances。 作者使用“新静态”的原因 是在该数组中存储被调用类的对象。 因为只有一个数组,所以Singleton类中该数组的self ::和static :: calls将返回相同的数据。

所以,澄清一下,当你打电话给:

$b_instance = B::getInstance();

B的一个实例被添加到存储在Singleton中的$ _instances数组中。 如果向B或C类添加静态$ _instances属性,行为将会不同,因为新创建的实例将存储在其自己的类static _ _stances属性中。

链接地址: http://www.djcxy.com/p/58035.html

上一篇: PHP Late Static Binding in Singleton

下一篇: php oo programming parent to instantiate child