【发布时间】:2026-02-22 17:45:01
【问题描述】:
我想先展示一个测试用例:
class A {
public static $instance=null;
public function __construct(){
self::$instance=$this;
}
public function className(){
return get_class(self::$instance);
}
}
class B extends A {
public function className(){
return get_class(self::$instance);
}
}
// test code
$b=new B();
echo $b->className; // B
$a=new A();
echo $a->className; // A
echo $b->className; // A <- error: not B any more!
备注
- 我在上面使用工厂+单例模式。嗯,有点。
- 我不需要任何关于“正确实现模式”的规范。我需要解决问题,而不是违反 KISS ;)。
- 批评者可能会说 A 应该是一个接口。理想情况下,它应该是这样的,但它只是一个简单的类,抱歉。
问题在于self::$instance 对于所有实例都是相同的。如何为每个班级分隔self::$instance?
编辑:我有这个想法:
$GLOBALS['store']=array();
class A {
public static $instance=null;
public function __construct(){
$GLOBALS['store'][__CLASS__]=$this;
}
}
【问题讨论】:
-
这就是静态的意思。它们都使用相同的变量。所以任何改变都会改变变量。
-
我不确定
__CLASS__是否在运行时确定... IMO 将始终为“A”。 -
啊,我明白你在做什么。一旦您向明确的问题添加了额外的信息,它就不再是傻瓜了。
-
@giraff:
__CLASS__在编译时确定...如果要使用后期静态绑定(5.3+),请使用static::$foo而不是self::$foo...
标签: php static singleton properties factory