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