我有一些关于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之后,我们在两种情况下都有相同的实例数组:with static :: $ _ instances and 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数组是相同的,为什么作者使用静态,而不是自我?非常感谢,对不起我的英语。
答案 0 :(得分:2)
所有类共享Singleton类中包含的相同静态数组$ _instances。作者使用“新静态”的原因;是在该数组中存储被调用类的对象。因为只有一个数组,所以在Singleton类中对该数组的self ::和static ::调用将返回相同的数据。
所以,澄清一下,当你致电:
$b_instance = B::getInstance();
正在将一个B实例添加到Singleton中存储的$ _instances数组中。如果向B或C类添加了静态$ _instances属性,则行为会有所不同,因为新创建的实例将存储在其自己的类static $ _instances属性中。