默认参数值是否覆盖提供的参数?

时间:2013-02-11 19:38:17

标签: php function default-arguments

我在PHP中有一个函数,它有一些默认为null的参数,所以我可以用少于全部参数来轻松调用它。 问题是,当我直接使用null-defaulted参数时,我得到给定的参数,但是当我尝试将该值复制到另一个变量时,该变量只获得默认值null。 它看起来像这样:

// inside my MySQLI wrapper class...
public function bind(&$stmt, $types = "", &$arg1, &$arg2 = null, &$arg3 = null /* this goes up to 20; it's auto-generated by another script */)
{
    echo "dumping...";
    var_dump($arg1); // var_dump shows value from function call (string(0))
    var_dump($arg2); // ditto
    echo "...dumped";
    if ($arg2 != null) $foo = $arg2; var_dump($foo); echo "foo"; // var_dump shows that $foo is NULL
    /* ... */
}

我从另一个脚本调用这样的函数: (这是一个处理卡车和汽车的虚拟脚本。)

$make = "";
$model = "";
$year = 0;
$license = "";
list($error, $message) = $mysql->bind($stmt, "", $make, $model, $year, $license);

我的bind()函数是MySQLI的bind_param()bind_result()函数的包装器。 我只包括顶部的几行,因为它已经失败了,在它甚至达到实际逻辑之前。

现在,它看起来好像是PHP中的一个错误,因为这不符合我对变量,参数,默认参数和引用如何工作的了解。 此外,这个问题似乎只在我的真实代码中表现出来,并没有出现在我编写的简单的php文件中以进行测试。

更多信息:

$foo为空字符串NULL时,

$arg2被分配"",并且当它是非空字符串时正确获得分配。空字符串仍然是有效的字符串,那么为什么PHP会这样做呢?

1 个答案:

答案 0 :(得分:1)

问题是!=比较。会发生什么是PHP type-juggles至少有一个变量,因此"" != null的计算结果为false。该表向下部分this page显示了不同类型之间的比较会发生什么。需要类型严格的格式!==

if ($arg2 !== null)
    $foo = $arg2;