爲什麼我收到此錯誤:爲什麼方法聲明不兼容?
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