单例中的PHP后期静态绑定

单例中的PHP后期静态绑定,php,static,late-binding,Php,Static,Late Binding,我从habrahabr.ru上的某篇文章中得到了以下代码: abstract class Singleton { protected static $_instances = array(); protected function __construct() { } public static function getInstance() { $class = \get_called_class(); if

我从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”之间的主要区别:例如,如果我们将$\u实例定义为public,并尝试创建另一个类,如

class C extends Singleton {

    private $_z =  55;

}
并将Singleton定义为非抽象类,在每次调用getInstance后,我们在两种情况下都有相同的实例数组:静态::$\u实例和self:$\u实例:

$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能否帮助我并告诉我,为什么$\u实例数组是相同的,为什么作者使用静态数组而不是self?非常感谢,对不起,我讲的是英语。

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

因此,澄清一下,当你打电话时:

$b_instance = B::getInstance();

正在将B的一个实例添加到存储在Singleton中的$\u实例数组中。如果在B或C类中添加了静态$\u instances属性,则行为会有所不同,因为新创建的实例将存储在其自己的classes静态$\u instances属性中。

可能与否重复,这不是重复。我知道,什么是LSB。我问了另外一个问题。如果你认为它不是重复的,那么就澄清这个问题,而不是说“不,它不是”。除了我刚才删除的答案,你没有得到任何其他答案,所以要么我们都是哑巴,要么你的问题不清楚。你的选择。我不知道如何描述这个问题,换句话说,如果这个问题是严格的,而不是关于“帮助我,我不想阅读文档,什么是LSB?”77“非常感谢。但是,作为最后一个问题:如果我写“static::$\u instances”,当调用B::getInstance()或“Singleton的实例数组”时,PHP将其解释为“B的实例数组”?我认为“B中的数组”,是吗?不,是单例数组,因为B没有自己的$\u实例。。。当您从B中调用B::$\实例或静态::$\实例时,它将引用Singleton中的实例。如果您在B中显式定义了$_实例,这将是不同的。我无法理解意识形态:“static”是用Singleton的方法编写的,所以当这个方法从B调用时,为什么static不引用B?它引用B,但因为B不包含$_实例的定义,它被传递给父类Singleton。如果您将$\u实例添加到B,则情况会有所不同,但实际上,B只能访问$\u实例,因为Singleton中有一个实例。$_实例的一个实例,在没有自己实例的所有子类之间共享。将“受保护的静态$_实例=数组();”添加到B和/或C,然后重新运行示例。你应该明白我的意思。