Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用两个或多个类名限制方法参数的类型?_Php - Fatal编程技术网

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

Php 使用两个或多个类名限制方法参数的类型?,php,Php,我们可以限制方法参数的类型;例如,我们应该说函数参数应该是名为“Some class”的类中描述的对象的实例 是否有任何php本机的可能性限制方法参数与两个或更多的类?例如,“某类”或“某类2”或“某类3” 或者,也许有任何方法可以用实现名为“Some_interface”的接口的类来限制方法参数 多谢各位 您可以使用,例如 一些实现接口的类 class FileLog implements LoggableInterface { public function log() { /*

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

是否有任何php本机的可能性限制方法参数与两个或更多的类?例如,“某类”或“某类2”或“某类3”

或者,也许有任何方法可以用实现名为“Some_interface”的接口的类来限制方法参数

多谢各位

您可以使用,例如

一些实现接口的类

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 ... */ }
}
然后,您可以将其用作如下所示的:

function some_function(LoggableInterface $anyLogger);
通过这种方式,您可以确保传递给
some_function()
的参数具有方法
log()
。传递给它的具体内容并不重要(
FileLog
DbLog
SysLog
),只需要这些类实现接口即可

一些实现接口的类

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 ... */ }
}
然后,您可以将其用作如下所示的:

function some_function(LoggableInterface $anyLogger);

通过这种方式,您可以确保传递给
some_function()
的参数具有方法
log()
。不管您传递给它的具体内容是什么(
FileLog
DbLog
SysLog
),只要这些类实现了接口就行了。

您应该使用类继承或接口来实现它。

您应该使用类继承或接口来实现它。

原则上不,但是你可以假装:因为PHP是一种动态语言,类型错误发生在运行时;您可以通过在函数的开头添加以下内容手动触发错误:

if(check_any_type_constraints_here)
     trigger_error("Argument is not valid!", E_USER_ERROR);
为了使脚本崩溃,它将像PHP的内置参数类型检查一样可靠地工作;)

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


希望这会有所帮助。

原则上不会,但您可以假装它:因为PHP是一种动态语言,所以类型错误会在运行时发生;您可以通过在函数的开头添加以下内容手动触发错误:

if(check_any_type_constraints_here)
     trigger_error("Argument is not valid!", E_USER_ERROR);
为了使脚本崩溃,它将像PHP的内置参数类型检查一样可靠地工作;)

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


希望这有帮助。

请告诉我,我该怎么做?我如何申报?方法(接口名称$class)或类s/th方法(实现接口名称$class)。谢谢大家!@如上图所示。你需要哪一部分的帮助?对不起,我已经在你答案的第一版发布了评论。非常感谢您的详细回答。请您告诉我,我该怎么做?我如何申报?方法(接口名称$class)或类s/th方法(实现接口名称$class)。谢谢大家!@如上图所示。你需要哪一部分的帮助?对不起,我已经在你答案的第一版发布了评论。非常感谢你详细的回答。