关于PHP可变参数与缺省参数
2011-09-20 09:02
309 查看
【缺省参数】
PHP中可以使用缺省参数来定义可变参数的方法,如下:
function dafaultParameter ($name, $age, $gender = "男", $job = "工人")
{
echo "姓名:". $name;
echo ",年龄:". $age;
echo ",性别:" . $gender;
echo ",职业:". $job . "。";
}
dafaultParameter("张三", "24");
echo "<br />";
dafaultParameter("李四", "25", "女");
echo "<br />";
dafaultParameter("王五", "26", "男",
"医生");
使用默认参数可以方便的实现类似函数重载的效果,但是更方便更容易了:只需要定义一个方法,然后在参数列表里使用缺省参数,这样就可以实现上例中定义一个方法却可以有三种不同参数列表的形式。但是使用缺省参数里一定要注意不可以把缺省参数放在正常参数之前,也就是说缺省参数只能放在参数列表的最后面,多个缺省参数不限顺序。
原因很简单:定义方法,
function dafaultParameter ($name, $gender = "男", $age, $job = "工人")
{ …… }
调用时,
如果是想省略参数$gender,即dafaultParameter("王五",
"26", "医生");
实际上这是不可能实现的,因为王五赋值给了$name,26赋值给了$gender,医生赋值给了$age,而$job是没有赋值的。
无论是使用dafaultParameter("王五", "", "26", "医生");
还是使用 dafaultParameter("王五", null, "26", "医生");
第二个参数gender都是被赋了值的,空字符串(“”)或者关键字null。
因此缺省参数只能放在参数列表的最后面,使用时要留意。
【其他办法】
也可以使用以下实现方法实现可变参数:
func_num_args()
func_get_args();
func_get_arg();
示例代码如下:
function variableParameter()
{
$numargs = func_num_args();
echo "参数个数为{$numargs}个。";
echo "<br />";
if ($numargs > 0)
{
$arg_array = func_get_args();
for ($i=0; $i<$numargs; $i++)
{
echo "[参数{$i}]的值为:{$arg_array[$i]}。";
echo "<br />";
}
}
}
variableParameter();
echo "<hr />";
variableParameter("test");
echo "<hr />";
variableParameter("a", "b", "c");
echo "<hr />";
variableParameter("一", "二", "三",
"四");
使用这种方法可以获得更大的灵活,但是因为它太灵活可能会出现一些不容易发现的错误,这样就必须慎这种方式或者在方法内部逻辑对参数进行严格的校验和限制,否则一个可以带任何参数的方法肯定是非常不好用的,因为没有形式参数就不好判断哪个参数代表什么,因为这种方式应该作为其它方案的补充和扩展。
一定要特别注意这种方式在处理含有缺省参数的方法:
function variableParameter($default_param = "default value")
{
echo "默认参数为:" . $default_param . "<br />";
$numargs = func_num_args();
echo "参数个数为{$numargs}个。";
echo "<br />";
if ($numargs > 0)
{
$arg_array = func_get_args();
for ($i=0; $i<$numargs; $i++)
{
echo "[参数{$i}]的值为:{$arg_array[$i]}。";
echo "<br />";
}
}
}
variableParameter();
echo "<hr />";
调用variableParameter()时并没有传递任何参数,因此$numargs代表的参数个数为0,但是因为方法定义时含有一个缺省参数,因此调用该用法还是会在方法体内创建一个参数副本。
相关文章推荐
- Java中关于可变长参数的那些事
- 关于可变参数中需要用到的宏va_start,va_arg,va_end
- php 获取可变函数参数的函数
- C#关于params的用法(使用数量可变的参数)
- 关于Python中的参数定义及可变参数
- Python函数、缺省参数、不定长参数、不可变和可变类型、拆包,元组,字典、引用、递归
- 关于可变参数的函数
- 关于PHP5.1.1 short_open_tar 参数。
- JS与PHP向函数传递可变参数的区别实例代码
- php可变参数实现
- 今天学习了关于C++ 中可变参数个数函数的使用!
- 关于C中函数的可变参数va_list...
- 关于可变参数
- 关于静态导入,装箱与拆箱,枚举,以及可变参数的学习
- c语言中关于可变参数的一个用法实例
- php匿名函数和可变参数函数
- 关于GCC和C99中可变参数宏
- 关于C语言中assert函数和可变参数介绍
- PHP关于函数的参数问题
- [问题记录]Java关于可变参数重载问题的测试