2017-07-31 147 views
-2

我有两个类,如下所示: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,我得到以下错误:

Declaration of B::update(array $one) should be compatible with A::update(array $one, array $two) in B.php on line 3

很明显,B :: update存在问题。我正在给A :: update两个数组。但不知何故,我失去了一些东西。 我试图在构造函数中进行初始化。我也尝试手动添加第二个数组到A :: update(parent :: update),但我似乎得到相同的错误。 有没有人有一个想法,为什么我得到这个问题?我的PHP版本:v7.0.18提前

+3

您将'A()'定义为需要抽象类中的两个参数,然后尝试定义它在您的类中具有两个继承自它的参数。你不能那样做。 –

+0

但是由于签名不一样,我不清楚自己是否试图覆盖它本身?令人烦恼的是,这个确切的代码之前已经有效。但是,因为我跳到我现在的PHP版本,我得到这个错误。 –

+1

错误一直存在,您刚刚在以前的PHP配置中将其压制。而PHP只能通过名字来识别功能;您没有两种方法可以覆盖该方法。 – deceze

回答

2

这是因为PHP确实方法重载没有方法超载。所以方法签名必须完全匹配。

要覆盖基类中的函数,方法必须具有与正在替换的方法相同的“签名”。

签名包含名称,参数(和参数顺序)和返回类型。

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

+0

我是一个PHP新手。出于这个原因,我不知道,在PHP上重载是不可能的。我只是改了名字,现在我已经没有错误了。 –

+0

反正你可以通过__call()或func_get_args()的帮助实现重载。但不推荐__call(),大多数现代语言不允许重载。希望有所帮助。请参阅此链接了解更多信息:http://www.php.net/manual/en/language.oop5.overloading.php –

1

PHP是想指出的问题
由于是这样的:

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

caller(new B); 

由于B extends ABinstanceof A。对A键入提示的任何代码也将接受B,,并且期望界面相同。这就是为什么接口应该兼容。