-2

我在 PHP 中有一个函数,它的一些参数默认为null,因此我可以轻松地用少于全部数量的参数来调用它。问题是,当我直接使用空默认参数时,我得到了给定的参数,但是当我尝试将该值复制到另一个变量时,该变量仅获得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()函数是 MySQLIbind_param()bind_result()函数的包装器。我只包括了前几行,因为它在那个时候已经失败了,甚至在它到达实际逻辑之前。

现在,它看起来只是 PHP 中的一个错误,因为这不符合我所知道的关于变量、参数、默认参数和引用如何工作的知识。此外,这个问题似乎只出现在我的真实代码中,并没有出现在我编写的用于测试它的简单 php 文件中。

更多信息:

$foo被赋值NULL,when$arg2是一个空字符串,""当它是一个非空字符串时被正确赋值。空字符串仍然是有效字符串,那么 PHP 为什么要这样做呢?

4

1 回答 1

1

问题是!=比较。发生的情况是 PHP至少对您的一个变量进行了类型"" != null处理,因此计算结果为 false。本页下方的表格显示了不同类型之间的比较会发生什么。需要类型严格的形式!==

if ($arg2 !== null)
    $foo = $arg2;
于 2013-02-13T20:35:02.347 回答