【问题标题】:PHP Override extended class method from static to non-static [duplicate]PHP覆盖扩展类方法从静态到非静态[重复]
【发布时间】:2019-06-15 05:31:45
【问题描述】:

我有一个包含静态方法的类“A”。现在我想要该类的副本(无论是否通过扩展),但我需要该静态方法在新类中变为非静态。

欢迎任何想法。提前致谢。

我尝试扩展,但在将方法重新声明为非静态时出现错误:

class A {
  protected $key = null;

  static function methodX($args) {
    // ...
  }
}

class B extends A {
  protected $key = "key";

  public function methodX($args) {
    // ...
    return $this->key;
  }
}

【问题讨论】:

    标签: php


    【解决方案1】:
    1. 覆盖的实际风格与对象相关联。覆盖是当我们将子类对象传递给父类引用变量但静态方法与类相关联,它们没有与对象链接,因此我们无法覆盖静态方法

    2. 这里的答案是否定的。是什么原因?好吧,因为一个类的非静态成员变量总是属于一个对象——这意味着每个对象都有它自己的非静态成员变量(也称为实例变量)的个人副本。而且,静态函数没有对象可以使用,因为它们属于整个类。请记住,您可以在没有对象的情况下调用静态函数 - 正是出于这个原因,静态函数不能调用实例变量。

    3. 您只能将静态方法重写为静态方法。

    【讨论】:

      【解决方案2】:

      但您不能,您必须将其覆盖为静态或在您的孩子中为非静态创建一个新函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-12
        • 2012-11-07
        • 2010-10-26
        • 2011-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多