函数参数的多个接口要求

时间:2011-11-16 08:28:58

标签: php oop

有没有办法在PHP中实现这样的东西?

interface Editable {}
interface Deletable {}

function clear(Editable Deletable $object) {
...
}

2 个答案:

答案 0 :(得分:4)

您可以扩展类等接口:

interface Editable {}
interface Deletable {}
interface EditAndDeletable extends Editable, Deletable {}

function clear(EditAndDeletable  $object) {
...
}

$ object的类型现在必须实现Editable和Deleteable的所有方法。

答案 1 :(得分:1)

如果我是你,我有这个问题,我可能会做这样的事情:

interface Editable {}
interface Deletable {}

function clear($object) {
    if( $object instanceof Editable ){
        ...
    }elseif( $object instanceof Deletable  ){
        ...
    }else{
        throw new InvalidArgumentException("\$object must be of type 'Editable' or 'Deletable' but " . get_class($object) . " was provided.");
    }
    ...
}

不是试图仅为一个参数的签名构建接口,而是更倾向于处理函数体本身中的参数并从签名中删除严格的要求。如果你得到一个不好的论点,Exception就是为了保持整洁。