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 как общедоступные и пытаемся создать другой класс, например

 class C extends Singleton { private $_z = 55; } 

и определить Singleton как не абстрактный класс, после каждого вызова getInstance мы имеем один и тот же массив экземпляров в обоих случаях: с static :: $ _ экземплярами и self :: $ _ экземплярами:

     $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 одинаковы, и почему автор использует статические, а не само? Большое вам спасибо, извините за мой английский.

    Related of "PHP Поздняя статическая привязка в синглтоне"

    Все классы имеют один и тот же статический массив $ _instances, содержащийся в классе Singleton. Причина, по которой автор использовал «новый статический»; должен был хранить объект вызываемого класса в этом массиве. Поскольку существует только один массив, self :: и static :: вызовы этого массива из класса Singleton возвращают те же данные.

    Итак, чтобы уточнить, когда вы звоните:

     $b_instance = B::getInstance(); 

    экземпляр B добавляется в массив $ _instances, хранящийся в Singleton. Если вы добавили статическое свойство $ _instances в класс B или C, поведение было бы иным, поскольку новый созданный экземпляр будет храниться внутри его собственных классов static $ _instances.