У меня есть этот код из какой-то статьи на 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];
}
}
Автор использует его как, например,
class B extends Singleton {
private $_a = 10;
}
Но я не могу понять главное различие между «static» и «self» в этом случае: например, если мы определим $ _instances как public и попытаемся создать какой-то другой класс, такой как
class C extends Singleton {
private $_z = 55;
}
и определяем Singleton как не абстрактный класс, после каждого вызова getInstance у нас есть одинаковый массив экземпляров в обоих случаях: со статическими :: $ _ экземплярами и 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 одинаковы и почему автор использует static, а не self? Большое спасибо, извините за мой английский.