2013-02-11 72 views
-2

我在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这样做呢?

+2

我试了一下,我没有问题:http://codepad.org/9cioWS04 – 2013-02-11 19:45:55

+1

你也可以说这实际上产生问题的代码?如果您发布的代码没有生成该代码,那么即使您认为它们在功能上相同,也必须在两者(或其上下文)之间有所区别。这也可能有助于了解您如何调用该函数。 – octern 2013-02-11 19:46:13

+0

哦,另外:'null'可能是一个不好的测试默认值,因为很多东西都会导致变量被设置为null。我建议将代码中的默认值更改为其他值。如果变量仍然以null结尾,那么你的问题与默认值无关。 – octern 2013-02-11 19:47:42

回答

1

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

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