关于PHP可变参数与缺省参数

来源:互联网 发布:深交所网络投票系统 编辑:程序博客网 时间:2024/05/17 02:27
 

【缺省参数】

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", "医生");

实际上这是不可能实现的,因为王五赋值给了$name26赋值给了$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,但是因为方法定义时含有一个缺省参数,因此调用该用法还是会在方法体内创建一个参数副本。