【问题标题】:Default argument value is overriding provided argument?默认参数值覆盖提供的参数?
【发布时间】:2013-02-11 19:38:17
【问题描述】:

我在 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() 函数是 MySQLI 的 bind_param()bind_result() 函数的包装器。 我只包括了最上面的几行,因为它已经失败了,甚至在它到达实际逻辑之前。

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

更多信息:

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

【问题讨论】:

  • 我试过了,没问题:codepad.org/9cioWS04
  • 你能显示实际产生问题的代码吗?如果您发布的代码没有产生它,那么即使您认为它们在功能上应该相同,两者(或它们的上下文)之间也一定存在差异。了解您如何调用该函数也可能会有所帮助。
  • 哦,另外:null 可能是一个不好的测试默认值,因为很多事情都可能导致变量被设置为 null。我建议将代码中的默认值更改为其他值。如果变量仍然以 null 结束,那么您的问题与默认值无关。
  • 用实际代码更新。 @octern:我的参数设置为合理的值(例如长度为零的字符串)并立即被相关函数取消。

标签: php function default-arguments


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    相关资源
    最近更新 更多