【问题标题】:PHP Static Properties, Inheritance, and the self keywordPHP 静态属性、继承和 self 关键字
【发布时间】:2013-11-17 20:20:09
【问题描述】:

这对我来说没有意义:

class A {
    public static $value = "a";
    public static function get_value(){
        return self::$value;
    }
}

echo A::$value;       // a, this makes sense
echo A::get_value();  // a, this makes sense

class B extends A {
    public static $value = "b";
}

echo B::$value;       // b, this makes sense
echo B::get_value();  // a?  :(

为什么self 指针不能按预期工作,类似于this?是否有其他关键字可用于完成此操作?

如果我将静态函数添加到 B 类,它现在可以按预期工作。

class B extends A {
    public static $value = "b";
    public static function get_value(){
        return self::$value;
    }
}

echo B::get_value();  // b  :)

如果方法包含多于 1 行,则复制+粘贴此功能并在 2 个位置进行管理是没有意义的...

【问题讨论】:

  • 尝试使用 static:: 关键字而不是 self::
  • 我刚才问过这个same question。也许您可以使用其中的一些回复。

标签: php static-methods


【解决方案1】:

后期静态绑定:

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

后期静态绑定通过存储在最后一个“非转发调用”中命名的类来工作。

在您的示例中尝试使用 static:: 关键字而不是 self::

【讨论】:

  • 好的,很酷。这令人困惑。我原以为他们会让selfstatic 一样工作,然后如果你无论如何都需要明确引用这个类,你可以使用精确的类名(A:: 而不是self::)。
  • self 关键字不遵循继承规则。 self 始终解析为在运行时使用它的类:如果您在父类中创建一个方法并从子类中调用它,self 将不会像您所看到的那样引用子类:)
  • 也许你可以在这里详细说明:stackoverflow.com/questions/20035799/…
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 2011-04-16
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2013-12-16
相关资源
最近更新 更多