【发布时间】:2011-03-01 08:36:27
【问题描述】:
我在 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;
}
但在这种情况下,我无法理解“静态”和“自我”之间的主要区别:例如,如果我们将 $_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 数组是相同的,为什么作者使用静态而不是自我?非常感谢,对不起我的英语。
【问题讨论】:
-
不,这不是重复的。我知道,什么是 LSB。我问了其他问题。
-
如果您认为它不是重复的,那么请澄清问题,而不是仅仅说“不,它不是”。除了我刚刚删除的答案之外,您没有得到任何其他答案,因此要么我们所有人都很愚蠢,要么您的问题不清楚。你的选择。
-
如果问题很严格,而不是关于“帮帮我,我不想阅读文档,LSB 是什么???77”,我不知道该如何描述问题
标签: php static late-binding