php中的多态性+接口

时间:2014-02-05 22:57:12

标签: php oop interface polymorphism

考虑一下你有这个代码:(结果将是"工作")

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。

  1. 为什么php不支持这个?是真的有原因还是更像是语言中的错误?
  2. typehint和instanceof之间的类型检查有何不同?
  3. 其他语言对此有何看法?

1 个答案:

答案 0 :(得分:0)

您还必须在Interface iRepository中的save方法中将iUser更改为User。 接口方法必须始终与实现方法兼容。这就是全部,没有语言问题或者类似的......在其他(编译)语言(例如C#,Java)中,你会在编译之前得到一个错误。