【问题标题】:do extended classes inherit static var values (PHP)?扩展类继承静态变量值(PHP)吗?
【发布时间】:2011-02-20 19:43:41
【问题描述】:

如果我有一个包含静态var的基类,然后我设置这个静态var,然后有一个扩展基类的类,扩展类是否会保留我已经设置的静态var的值基类?

【问题讨论】:

    标签: php static extending-classes


    【解决方案1】:

    是的,虽然它们是不同的变量,但两个类中的静态变量在同一个引用集中。

    您可以通过使用引用分配 (=&) 或在扩展类中重新声明它来破坏此引用集:

    class base {
        public static $var;
    }
    class extended extends base {}
    
    extended::$var = 8; // base::$var == 8
    $t = 6;
    extended::$var =& $t; // base::$var == 8; extended::$var == 6
    
    class base {
        public static $var;
    }
    class extended extends base {
        public static $var;
    }
    
    extended::$var = 8; // base::$var == null; extended::$var == 8
    

    【讨论】:

    • -1 上面声明的$var 属性不是静态的,但您将它们作为静态引用。继承的静态属性与其子类共享。
    • @David 谢谢,已修复。但这显然是一个错字,因为问题和答案都是关于静态变量的。
    • 我的意思是“它们是不同的变量”是不正确的。 AFAIT,子类继承对其父类的公共/受保护静态变量的访问,而不为新变量创建空间。但是,您的示例代码可以像宣传的那样工作。在您分配对子类的$var 的引用之前,变量是链接的。每个子类是否都在内部复制其父类的静态变量声明,并将每个子类设置为对匹配父变量的引用?
    • @Artefacto - 对于继承的静态变量,使用ReflectionProperty 将父级显示为类,因此在我看来它就像一个符号。但是,这并不意味着正如您的示例所展示的那样,这就是幕后发生的事情。 ;)$a$b的情况比较明显;显然涉及两个符号。
    • 事实上,即使在将$t 引用分配给$var 之后,反射仍将base 显示为$varextended 内的类。
    猜你喜欢
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 2020-10-18
    • 2011-05-27
    • 1970-01-01
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多