我想首先展示一个测试用例:
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 应该是一个接口(interface)。理想情况下,它应该是这样的,但抱歉,这只是一个简单的类。
问题在于 self::$instance
对于所有实例都是相同的。如何为每个类分隔 self::$instance
?
编辑:我有这个想法:
$GLOBALS['store']=array();
class A {
public static $instance=null;
public function __construct(){
$GLOBALS['store'][__CLASS__]=$this;
}
}
最佳答案
您可以为每个类名存储一个实例:
class A {
public static function getInstance(){
// Maybe use this function to implement the singleton pattern ...
return self::$instance[get_called_class()];
}
public function className(){
return get_class(self::getInstance());
}
}
关于PHP 扩展类使子级继承相同的静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4472195/