このエラーが表示される理由:
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が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のインスタンスであることを示します。
この動作が正しいかどうかについての洞察はありますか?