PHP5.3之前的静态继承
为什么:PHP5.3之前的静态继承,php,inheritance,static,php-5.3,Php,Inheritance,Static,Php 5.3,为什么: class A { static $v = "A"; static function echoExtendedStaticVariable() { echo self::$v; } } class B extends A { static $v = "B"; // override A's variable with "B" } 打印“A”? 我如何让它打印“B” 在PHP5.3之前,有没有办法做到这一点?B->echoEx
class A
{
static $v = "A";
static function echoExtendedStaticVariable() {
echo self::$v;
}
}
class B extends A
{
static $v = "B";
// override A's variable with "B"
}
打印“A”?
我如何让它打印“B”
在PHP5.3之前,有没有办法做到这一点?
B->echoExtendedStaticVariable()='a'
,因为self::
是在编译时计算的,而不是在运行时。这就好像你写的是A::
而不是self::
您需要的是一个称为“后期静态绑定”的特性——它是“后期”的,因为它可以在运行时而不是在编译时确定类
您可以在PHP5.2中使用ReflectionClass
模拟这种情况:
echo B::$v
请注意,您只能在有权访问实例的情况下执行此操作,因此您不能将
echoxtendedstaticvariable
设为静态方法,并期望此方法能够正常工作。在PHP5.2中无法轻松做到这一点(即:不显式重写每个方法)
调用B::echokextendedstaticvariable
时,它将转发到A::echokextendedstaticvariable
,范围更改为A
中的一个,所有关于B
的绑定都将消失。没有回溯,没有反射,没有魔法常数,什么都没有:它都指向A
在我看来,除非真的有必要,否则应该避免使用静态成员,而且这种情况很少发生。这使得代码很难扩展,因为依赖项注入是有限的,替换几乎是不可能的(除了像Singleton这样的反模式)。它不打印“A”,而是打印“B”。你是说
$b=newb()$b->EchoxtendedStaticVariable()=='A'
?我的意思是说可能存在重复的。。。所有内容都应该是静态的。请编辑您的原始问题,以准确了解您想要的内容。是否有其他方法不创建对象就可以完成此操作?只是在类上运行函数?在什么类上运行什么函数?在php<5.3中,父类中的静态方法无法知道它是否是通过另一个类静态调用的。这些名称都是在编译时解析的。正如@netcoder所说,这不是一个好的设计!使用实例有什么不对?
class A
{
static $v = "A";
function echoExtendedStaticVariable() {
$rc = new ReflectionClass($this);
echo $rc->getStaticPropertyValue('v');
}
}
class B extends A
{
static $v = "B";
}
$b = new B();
$b->echoExtendedStaticVariable(); // B