考虑一下你有这个代码:(结果将是"工作")
interface iUser { }
interface iRepository {
function save(iUser $user);
}
class User implements iUser {
}
class Repository implements iRepository {
# works with iUser but why not with User? User implements iUser :)
function save(iUser $user) {
if(!$user instanceof User)
throw new \InvalidArgumentException('...');
echo 'works!';
}
}
$user = new User();
$repo = new Repository();
$repo->save($user);
此示例有效,因为User实现了iUser。 如果我以这种方式实现保存功能:
function save(User $user) {
它失败并显示消息 存储库的声明:: save()必须与iRepository :: save()
的声明兼容从我的观点来看,这不是真的。用户完全可以使用iUser。
答案 0 :(得分:0)
您还必须在Interface iRepository中的save方法中将iUser更改为User。 接口方法必须始终与实现方法兼容。这就是全部,没有语言问题或者类似的......在其他(编译)语言(例如C#,Java)中,你会在编译之前得到一个错误。