PHP扩展类使子级继承相同的静态属性 [英] PHP Extending class makes children inherit same static property
本文介绍了PHP扩展类使子级继承相同的静态属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想先展示一个测试用例:
I'd like to start by showing a test case:
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!
注释
- 我在上面使用的是factory + singleton模式.好吧.
- 我不需要任何有关正确实现模式"的规范.我需要解决问题,而不是违反KISS的;). 评论家可能会说A应该是接口.理想情况下,应该是这样,但是很简单,很抱歉.
- I'm using a factory+singleton patterns above. Well, somewhat.
- I don't need any specs on "implementing patterns correctly". I need problem solving, not KISS violations ;).
- Critics might say A should be an interface. Ideally, that's what it should have been, but it's just a simple class, sorry.
问题在于所有实例的self::$instance
都相同.如何为每个班级分开self::$instance
?
The issues lies in the fact that self::$instance
is the same for all instances. How do I separate self::$instance
for each class?
我有这个主意:
$GLOBALS['store']=array();
class A {
public static $instance=null;
public function __construct(){
$GLOBALS['store'][__CLASS__]=$this;
}
}
推荐答案
您可以按类名称存储实例:
You could store an instance per class name:
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扩展类使子级继承相同的静态属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文