开始用PHP后,感觉这个语言越用越爽,丰富的函数支撑,松散的变量与方法定义,强有力的数组和字符串方法,让许多在在其他语言中异常麻烦的地方得到轻松解决,但是对于一开始只会Java的笔者来说,PHP有一个地方却让我感到有点不适,就是方法的重载方面。
在Java中,方法的重载是一个非常便利的特性,Java可以在一个类中定义多种方法而使用同一个名字,只要这些方法的传入的参数个数不同,就会调用不同的方法从而实现不同的功能,然而,PHP语言对于参数个数敏感却没有重载这一特性,让笔者在开发中异常苦恼
然而,问题总是能解决的,在这我发现了两种方法可以实现同一方法的参数扩展,省去不必要的重发代码
1. func_get_args()方法、func_get_arg()方法与func_num_args()方法
func_get_args()方法是获得该方法或函数的所有参数,以数组的形式返回
func_get_arg()方法是获得函数参数列表中的某一个参数,偏移量(offset)从0开始,即func_get_arg(3)获取的是第四个参数,返回用户自定义函数的参数列表中获取某个指定的参数,且 参数类型不变。
func_num_args()方法是获得函数参数列表的参数个数,返回一个整形数值。
举个栗子:
<?php
function foo (){
$num = func_num_args();
echo "参数个数:".$num."<br>";
if($num>=2){
echo "第二个参数是:".func_get_arg(1)."<br>";
}
$arg_list = func_get_args();
for ($i = 0; $i < $num; $i++) {
echo "Argument $i is: " . $arg_list[$i] . "<br>";
}
}
foo('arg1','arg2','arg3','arg4','arg5','arg6');
这段代码输出如下:
参数个数:6第二个参数是:arg2
Argument 0 is: arg1
Argument 1 is: arg2
Argument 2 is: arg3
Argument 3 is: arg4
Argument 4 is: arg5
Argument 5 is: arg6
如此这般,可以在定义方法时,不设置参数的情况下而获得参数的值
这里也特别提示一下PHP语言的传参特性:方法定义是设置的参数为必须要传入的参数,此外可以多传,但是定义了几个参数后,再调用方法时不能少调用,否则会报错。简洁点就是:相对你定义好的参数个数,调用时参数可以多传不能少传。
2. 传入数组参数方法
第二个方法属于开发过程中想出来的,就是在某一个参数的传入时利用数组传入多组参数。
例如:
function jointURL($base_url,$platform,$args){
if(!isset($base_url)){
return;
}
if (isset($platform)) {
$tmp = $base_url . $platform;
}else{
return;
}
if(!isset($args)){
return $tmp;
}else{
foreach ($args as $key => $value){
$tmp .= "&$key=$value";
}
}
var_dump($tmp);
return $tmp;
}
这是一个根据补充的参数拼接URL的方法,基础的拼接是是共同的URL和平台的URL拼接,但是有的平台需要添加日期和版本参数,有的只需要添加日期参数,有的只需要添加版本参数,此时就可以将其余的参数列为一个数组信息存入一个数组变量,在jointURL()
方法内就可以将$args
这个数组参数里的值拼接到URL后面
例如这样传入参数:
$args1 = [
'date' => '2016-05-30',
'version' => '1.7.1',
'channel' => 'baidu'
];
$args2 = [];
jointURL('www.','android',$args1);
jointURL('www.','IOS',$args2);
就会在界面上显示:
string(55) "www.android&date=2016-05-30&version=1.7.1&channel=baidu"
string(7) "www.IOS"
这样就实现了参数的扩展
其实第二种方法的实现倒是非常简单,但是向方法的参数中传入一个数组参数的这个思想倒是非常受用