Php类型暗示不与接口和抽象类相处?

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.

  • 在考虑一下后,我得出结论,你是对的.我相信我试图错过一个模式.非常感谢你. (3认同)