我们可以限制方法参数的类型;例如,我们应该说函数参数应该是类中描述的对象的实例,名称为“Some Class”。
function some_function(Some_Class $object) {
}
是否有任何php本机可用于限制两个或更多类的方法参数?例如,“Some Class”或“Some Class2”或“Some Class3”。
或许有没有办法用实现名称为“Some_Interface”的接口的类来限制方法参数?
谢谢。
答案 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()
。您传递给它的具体内容(FileLog
,DbLog
或SysLog
)并不重要,只是这些类实现了接口。
答案 1 :(得分:0)
您应该使用类继承或接口来执行此操作。
答案 2 :(得分:0)
原则上不是,但你可以伪造它:因为PHP是一种动态语言,所以在运行时会发生类型错误;你可以通过在函数开头添加类似的东西来手动触发错误:
if(check_any_type_constraints_here)
trigger_error("Argument is not valid!", E_USER_ERROR);
为了使脚本崩溃,它将像PHP的内置参数类型检查一样可靠地工作;)。
您只需要确保,如果在方法参数列表中添加实际约束,则所有有效值都可以通过它(您无需确保所有无效值都无法通过检查,这就是手动检查是为了)。对于OR'ing类型,最安全的方法是不在头中声明类型,并完全依赖于手动检查。如果你想要AND类型(比如你想要一个实现两个或更多特定接口的值),那么你可以把它们放在标题上(最好是最有可能失败的标题),然后检查其他的体。
希望这有帮助。