Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5.3之前的静态继承_Php_Inheritance_Static_Php 5.3 - Fatal编程技术网

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