使用两个或多个类名限制方法参数的类型?

时间:2010-04-18 21:34:48

标签: php

我们可以限制方法参数的类型;例如,我们应该说函数参数应该是类中描述的对象的实例,名称为“Some Class”。

function some_function(Some_Class $object) {
}

是否有任何php本机可用于限制两个或更多类的方法参数?例如,“Some Class”或“Some Class2”或“Some Class3”。

或许有没有办法用实现名称为“Some_Interface”的接口的类来限制方法参数?

谢谢。

3 个答案:

答案 0 :(得分:3)

您可以使用interface,例如

interface LoggableInterface
{
    public function log($message);
}

实现接口的一些类

class FileLog implements LoggableInterface { 
    public function log() { /* code to log to File ... */ }
}

class DbLog implements LoggableInterface { 
    public function log() { /* code to log to Db ... */ }
}

class SysLog implements LoggableInterface { 
    public function log() { /* code to log to SysLog ... */ }
}

然后你可以像TypeHint一样使用它:

function some_function(LoggableInterface $anyLogger);

这样您就可以确保传递给some_function()的参数有一个方法log()。您传递给它的具体内容(FileLogDbLogSysLog)并不重要,只是这些类实现了接口。

答案 1 :(得分:0)

您应该使用类继承或接口来执行此操作。

答案 2 :(得分:0)

原则上不是,但你可以伪造它:因为PHP是一种动态语言,所以在运行时会发生类型错误;你可以通过在函数开头添加类似的东西来手动触发错误:

if(check_any_type_constraints_here)
     trigger_error("Argument is not valid!", E_USER_ERROR);

为了使脚本崩溃,它将像PHP的内置参数类型检查一样可靠地工作;)。

您只需要确保,如果在方法参数列表中添加实际约束,则所有有效值都可以通过它(您无需确保所有无效值都无法通过检查,这就是手动检查是为了)。对于OR'ing类型,最安全的方法是不在头中声明类型,并完全依赖于手动检查。如果你想要AND类型(比如你想要一个实现两个或更多特定接口的值),那么你可以把它们放在标题上(最好是最有可能失败的标题),然后检查其他的体。

希望这有帮助。