【问题标题】:Parent static function calling static child variable父静态函数调用静态子变量
【发布时间】:2011-09-08 02:54:49
【问题描述】:

这是我正在处理的类的简化版本

class A {
   static protected function getVal() {
              return self::$valB;
            }
}
class B extend A {
   static protected $valB = 'Hello';
}
B::getVal(); // Hello

这应该在 php 版本 5.2.17 中工作还是我设置错误。我目前收到一条错误消息,提示找不到 A::$valB

【问题讨论】:

  • 实际错误“访问未声明的静态属性:A::$valB”

标签: php visibility php-5.2 late-static-binding


【解决方案1】:

需要后期静态绑定,它存在于 PHP 5.3.0 及更高版本中。

http://us3.php.net/manual/en/language.oop5.late-static-bindings.php

在 getVal 中,您需要使用 return static::valB; 而不是 return self::valB;

【讨论】:

    【解决方案2】:

    首先,您的代码语法错误。从修复它开始:

    class A {
       static protected function getVal() {
           return self::$valB;
       }
    }
    class B extends A {
       static protected $valB = 'Hello';
    }
    B::getVal();
    

    现在,这将永远无法工作,因为 getVal 受到保护。除非您从 A 或其子之一调用它,否则它将不起作用。

    self 关键字解析为调用它的类。由于selfA中使用:self == A

    您需要使用后期静态绑定来修复它:

    return static::$valB;
    

    最后,我建议你在 A 中声明 $valB 以避免致命错误:

    class A {
        static protected $valB;
        static protected function getVal() { ... }
    }
    

    【讨论】:

    • 在 B 中声明 $valB 的原因是因为会有一个 B.C. D、E 类将扩展 A,$valB 的值都不同。静态调用就像一个魅力,但在生产中只有 PHP v5.2 可用。也许这首先应该是问题。
    • @Clutch:是的,我想你会在子类中实现$valB,但请记住这是一个“语言特性”,其他语言不允许这样做(参见@987654321 @)。遗憾的是,对于 5.2,没有解决方法。
    • @Clutch 您应该尝试说服您的雇主或客户更新到 PHP 5.3,这里有一些弹药:Zend 现在不支持 PHP 5.2,并且不再提供安全补丁。 :)
    猜你喜欢
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多