为什么我收到此错误:为什么方法声明不兼容?
Fatal error: Declaration of ConcreteFooMapper::load() must be compatible with that of AbstractFooMapper::load() on line 18
从这个代码:
<?php
interface Foo {
public function foo();
}
class ConcreteFoo implements Foo {
public function foo() {
}
}
abstract class AbstractFooMapper {
abstract public function load(Foo $entity, array $data);
}
class ConcreteFooMapper extends AbstractFooMapper {
public function load(ConcreteFoo $entity, array $data) {
}
}
?>
我最初的想法是,这是一个错误; PHP没有检测到 ConcreteFoo implements Foo它在评估方法声明时它。我想这是因为,当您运行此代码:
<?php
interface Foo {
public function foo();
}
class ConcreteFoo implements Foo {
public function foo() {
}
}
$foo = new ConcreteFoo();
if ($foo instanceof Foo)
{
print 'w00t!';
}
else
{
print 'FAIL!';
}
?>
它打印 w00t!表示 ConcreteFoo是 Foo的一个实例。
对此行为是否正确的任何见解?
啊。这就说得通了。我希望能够使用类型提示来强制'ConcreteFooMapper'的'load'方法中传递'ConcreteFoo'的实例,但现在我看到了如何破坏协议/协议。 我只是在使用'instanceof'的方法的开头添加类型检入。这是我过去所做的。 – kulishch