【问题标题】:adding parameters to overridden method E_STRICT observation将参数添加到覆盖的方法 E_STRICT 观察
【发布时间】:2011-07-14 21:08:36
【问题描述】:

看来(PHP 5.3)如果您要覆盖类方法,可以添加其他参数,只要它们具有默认值即可。

例如,考虑类:

class test1 {
  public function stuff() {
    echo "Hi";
  }
}

以下类扩展了“test1”并将产生 E_STRICT 警告。

class test2 extends test1 {
  public function stuff($name) {
    echo "Hi $name";
  }
}

但是,以下不会产生 E_STRICT 警告。

class test3 extends test1 {
  public function stuff($name = "") {
    echo "Hi $name";
  }
}

虽然“test3”类不会产生 E_STRICT 警告,但我一直认为 PHP 不允许方法签名被 重载 覆盖。所以,我不得不问。我的观察是错误/缺陷还是实际上 正确 预期的行为?

另外,如果默认实参参数可以,为什么非默认实参参数不行?

【问题讨论】:

  • 我设置了 error_reporting(E_ALL) 并且无法重现 E_STRICT 错误。你能发布你看到的错误吗?另外,这不是“重载”,而是“覆盖”。
  • 不,不行。阅读Liskov substitution principle 和 PHP 允许这样做。
  • @helloandre,E_STRICT 未包含在 E_ALL 中。要开启 E_STRICT 通知,请设置error_reporting(E_ALL | E_STRICT);
  • @helloandre 和 E_STRICT 不会为这种情况生成 :)
  • 我没有收到属于 E_STRICT 的任何错误。我正在获得输出。

标签: php oop coding-style


【解决方案1】:

如果给重写的方法添加非默认参数,子类不再满足超类定义的约定。你不能正确地调用 test2->stuff(),因为这个方法现在需要一个参数——但是超类说你应该能够在没有参数的情况下调用它。因此出现 E_STRICT 警告。

如果你添加一个默认参数,你仍然可以调用 test3->stuff() (来自你的例子)——正如超类所期望的——所以合同没有被破坏。实际上,通过添加可选参数,您只是对其进行了扩展。

【讨论】:

    【解决方案2】:

    这不是错误,是可接受的 PHP 编程实践。

    请注意,多次覆盖可能会导致programmer headaches,应尽可能避免。

    或者,我通常要么有一个扩展类来覆盖每个类,要么只在实际类本身中重载一个类方法。

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2015-03-13
      • 2018-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多