来自c++背景;) 如何重载PHP函数?
一个函数定义如果有参数,另一个函数定义如果没有参数? 这在PHP中可行吗?或者我应该使用if else来检查是否有任何参数从$_GET和POST传递??把它们联系起来?
来自c++背景;) 如何重载PHP函数?
一个函数定义如果有参数,另一个函数定义如果没有参数? 这在PHP中可行吗?或者我应该使用if else来检查是否有任何参数从$_GET和POST传递??把它们联系起来?
当前回答
在PHP 5.6中,你可以使用splat操作符…作为最后一个参数,去掉func_get_args()和func_num_args():
function example(...$args)
{
count($args); // Equivalent to func_num_args()
}
example(1, 2);
example(1, 2, 3, 4, 5, 6, 7);
你也可以用它来解压缩参数:
$args[] = 1;
$args[] = 2;
$args[] = 3;
example(...$args);
等价于:
example(1, 2, 3);
其他回答
对某些人来说,这可能有点棘手,但我从Cakephp处理某些函数的方式中学到了这种方法,并对其进行了调整,因为我喜欢它所创造的灵活性
你有不同类型的参数,数组,对象等等,然后你检测你传递了什么,然后从那里开始
function($arg1, $lastname) {
if(is_array($arg1)){
$lastname = $arg1['lastname'];
$firstname = $arg1['firstname'];
} else {
$firstname = $arg1;
}
...
}
要重载一个函数,只需在默认情况下将参数传递为空,
class ParentClass
{
function mymethod($arg1 = null, $arg2 = null, $arg3 = null)
{
if( $arg1 == null && $arg2 == null && $arg3 == null ){
return 'function has got zero parameters <br />';
}
else
{
$str = '';
if( $arg1 != null )
$str .= "arg1 = ".$arg1." <br />";
if( $arg2 != null )
$str .= "arg2 = ".$arg2." <br />";
if( $arg3 != null )
$str .= "arg3 = ".$arg3." <br />";
return $str;
}
}
}
// and call it in order given below ...
$obj = new ParentClass;
echo '<br />$obj->mymethod()<br />';
echo $obj->mymethod();
echo '<br />$obj->mymethod(null,"test") <br />';
echo $obj->mymethod(null,'test');
echo '<br /> $obj->mymethod("test","test","test")<br />';
echo $obj->mymethod('test','test','test');
在PHP 5.6中,你可以使用splat操作符…作为最后一个参数,去掉func_get_args()和func_num_args():
function example(...$args)
{
count($args); // Equivalent to func_num_args()
}
example(1, 2);
example(1, 2, 3, 4, 5, 6, 7);
你也可以用它来解压缩参数:
$args[] = 1;
$args[] = 2;
$args[] = 3;
example(...$args);
等价于:
example(1, 2, 3);
那么这个呢:
function($arg = NULL) {
if ($arg != NULL) {
etc.
etc.
}
}
不能重载PHP函数。函数签名仅基于它们的名称,不包括参数列表,因此不能有两个同名的函数。PHP中的类方法重载不同于许多其他语言。PHP使用了相同的词,但它描述了不同的模式。
但是,您可以声明一个可变参数函数,该函数接受可变数量的参数。您可以使用func_num_args()和func_get_arg()来获取传递的参数,并正常使用它们。
例如:
function myFunc() {
for ($i = 0; $i < func_num_args(); $i++) {
printf("Argument %d: %s\n", $i, func_get_arg($i));
}
}
/*
Argument 0: a
Argument 1: 2
Argument 2: 3.5
*/
myFunc('a', 2, 3.5);