基本 PHP 原则上的 OOP 兼容性错误



>我有两个类如下:

<?php
abstract class A {
public function update(array $one, array $two) {
echo $one;
echo $two;
}
}
?>

然后 B 继承 A 类:

<?php
include ("A.php");
class B extends A {
public function update(array $one) {
$two = array(
"foo" => "bar",
"bar" => "foo",
);
parent::update($one, $two);
}
}
?>

当我尝试编译 B 时,出现以下错误:

B::update(数组$one(的声明应该与B.php第3行中的A::update(数组$one,数组$two(兼容

很明显,B::update存在问题。我给 A::update 两个数组。但不知何故,我错过了一些东西。 我尝试在构造函数中初始化。我还尝试手动将第二个数组添加到 A::update (parent::update(,但我似乎得到了同样的错误。 有没有人知道,为什么我会遇到这个问题?我的php版本:v7.0.18
提前感谢

这是因为PHP执行方法覆盖而不是方法重载。因此,方法签名必须完全匹配。

若要重写基类中的函数,方法必须具有与它所放置的函数相同的"签名"。

签名由名称、参数(和参数顺序(和返回类型组成。

这是多态性的本质,也是面向对象编程获得大部分功能的地方。如果不需要重写父方法的方法,请为新方法指定其他名称。

PHP 试图指出的问题是:

function caller(A $a) {
$a->update($foo, $bar);
}
caller(new B);

B extends A年起,B成为instanceof A。任何键入针对A提示的代码也将接受B并期望接口相同。这就是为什么接口应该是兼容的。

最新更新