基本PHP pricinple上的OOP兼容性错误

时间:2017-07-31 11:32:28

标签: php inheritance php-7

我有两个课程如下:

<?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
提前致谢

2 个答案:

答案 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 AB。任何键入instanceof A提示的代码也会接受A,并希望界面完全相同。这就是接口应该兼容的原因。