我有两个课程如下:
<?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(数组$ 1)的声明应与第3行的B.php中的A :: update(数组$ 1,数组$ 2)兼容
很明显,B :: update存在问题。我给A :: update两个数组。但不知怎的,我错过了一些东西。
我试图在构造函数中初始化。我还试图手动将第二个数组添加到A :: update(parent :: update),但我似乎得到了同样的错误。
有谁有想法,为什么我会遇到这个问题?我的php版本:v7.0.18
提前致谢
答案 0 :(得分:2)
这是因为PHP的方法覆盖而不是方法重载。因此方法签名必须完全匹配。
要覆盖基类中的函数,方法必须具有相同的&#34;签名&#34;到它正在取代的那个。
签名由名称,参数(和参数顺序)以及返回类型组成。
这是多态的本质,也是面向对象编程获得大部分功能的地方。如果您不需要覆盖父方法,请为新方法指定一个不同的名称。
答案 1 :(得分:1)
PHP试图指出的问题是:
RewriteCond %{REQUEST_FILENAME} -d [OR]
RewriteCond %{REQUEST_FILENAME} -f
自function caller(A $a) {
$a->update($foo, $bar);
}
caller(new B);
起,B extends A
为B
。任何键入instanceof A
提示的代码也会接受A
,,并希望界面完全相同。这就是接口应该兼容的原因。