Muc*_*Muc 16 php abstract-class types interface
我认为在代码示例中查看问题要比首先编写问题容易得多.这是我的PHP代码:
<?php
interface AnInterface
{
public function method();
}
class AClass implements AnInterface
{
public function method()
{
echo __METHOD__;
}
}
abstract class AnAbstractClass
{
abstract public function method( AnInterface $Object );
}
class ConcreteClass extends AnAbstractClass
{
public function method( AClass $Object )
{
$Object->method();
}
}
$Object1 = new ConcreteClass();
$Object2 = new AClass();
$Object1->method( $Object2 );
Run Code Online (Sandbox Code Playgroud)
上面的代码导致以下错误:
致命错误:ConcreteClass :: method()的声明必须与AnAbstractClass :: method()的声明兼容
问题是php似乎没有将AnAbstractClass :: method和ConcreteClass :: method的签名识别为兼容.难道我做错了什么?谢谢!
mea*_*gar 26
PHP似乎并没有被认识到的签名
AnAbstractClass::method,并ConcreteClass::method作为兼容.
PHP是正确的,它们是不兼容的.通过只允许AClass(或其子代)的实例传递给ConcreteClass::method你,你违反了AnAbstractClass 提供的契约:它的任何子类必须接受AnInterface它的参数method().
如果你的例子工作,并且我有另一个类BClass实现AnInterface,我们有一种情况,根据AnAbstractClass,method()应该接受实例BClass,而根据ConcreteClass,它不应该.
更改您的签名ConcreteClass::method以匹配AnAbstractClass::method.