【问题标题】:PHP method overloadingPHP 方法重载
【发布时间】:2011-02-21 06:09:34
【问题描述】:

我一直在开发一个 ORM,目前在测试中遇到了这个错误。

Declaration of ClassA::setB() should be compatible with that of SuperClass::setB()

我的代码是这样的。

class SuperClass() {

  protected $b;

  public function setB(ClassB $b) {
    $this->b = $b;
  }

}

class ClassB {}

class ChildB extends ClassB {}

class ClassA extends SuperClass {

  public function setB(ChildB $b) {
    parent::setB($b);
  }

}

这是例外行为。我认为ClassA是重载SuperClass的方法setB,但ClassA::setB仍然与SuperClass::setB兼容,因为类ChildBClassB的子类。

或者无论如何都禁止重载。

【问题讨论】:

    标签: php inheritance overloading internals


    【解决方案1】:

    在 PHP 中,重载方法的参数应该相同。您可以通过打开 STRICTerror reporting 来隐藏错误,否则您需要使参数相同。但是,修复参数以保持与新 PHP 版本的前向兼容性可能符合您的最大利益。

    【讨论】:

    • 重载为同一个函数引入一组不同参数的概念。你的意思是超越
    • @GolezTrol:PHP 不完全支持重载。在可以重载的编程语言中,andho 的代码是完全合法的。如果使用 ClassB 参数调用 ChildA::setB,它将调用 SuperClass::setB,因为 ChildA 没有接受 ClassB 的 setB。重载允许您拥有多个具有相同名称但具有不同参数的方法。在 PHP 中解决这个问题的最简单方法是不使用类型提示。
    • 我知道。我的评论只是为了澄清与 GWW 的一般差异,而不是提供有关 PHP 实现的完整答案。如果我要这样做,我会在我自己的单独答案中做到这一点。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多