将 0 传递给具有默认值的函数

Posted

技术标签:

【中文标题】将 0 传递给具有默认值的函数【英文标题】:Passing 0 to function with default value 【发布时间】:2012-03-23 02:19:09 【问题描述】:

我目前正在测试一个简单的 php 函数。

如果在没有传递任何参数的情况下调用函数,我想返回字段的当前值,如果传递了参数,我想设置一个新值。 奇怪的是:如果我通过 0(var_dump 显示正确的值 int(1) 0),函数进入 if 分支,就像我在没有任何值的情况下调用函数一样,我就是不明白为什么。

功能:

public function u_strasse($u_strasse = 'asdjfklhqwef')
  if($u_strasse == 'asdjfklhqwef')
    return $this->u_strasse;
   else 
    // set new value here
  

u_strasse()u_strasse(0) 让我进入 if 分支。

【问题讨论】:

同时我想出了一个更好的解决方案,我使用默认值只有 PHP 在调用没有参数的函数时会报告警告,并使用 func_num_args() 来选择要做什么。 if func_num_args() === 0 -> 返回值,否则设置新值 【参考方案1】:

你应该使用 null 作为默认值:

public function u_strasse($u_strasse = null)

    if ($u_strasse === null)  $u_strasse = 'asdjfklhqwef'; 

    // rest of function

【讨论】:

很好的解决方案,之前从未尝试过使用 null ,所以谢谢。我仍然不明白为什么 PHP 将 0 解释为默认值(如果不是)。【参考方案2】:

传递 '0' 而不是 0。前者将是一个字符串。 你可以像这样投射它:

$myvar = 0;

u_strasse((string)$myvar);

【讨论】:

我知道我只是好奇为什么 0 被视为默认值。如果我用 === 进行测试,它可以工作 PHP 会自动为您进行类型转换。因为你传入了一个 0 并且它在左边,所以字符串也将被转换为一个 int,并且最终也是 '0'。如果您的字符串的第一个字符(比如说)是“9”,那么您最终会得到 0 == 9 并通过错误的路径。【参考方案3】:

使用 === 代替 ==:

public function u_strasse($u_strasse = 'asdjfklhqwef')
  if($u_strasse === 'asdjfklhqwef')
    return $this->u_strasse;
   else 
    // set new value here
  

如果 == php 尝试将 'asdjfklhqwef' 转换为数字(因为您将 $u_strasse 作为数字传递)并且 (int)'asdjfklhqwef' 等于 0。为避免这种行为,您需要严格比较 (=== )

详细了解 == 和 === 的区别here

【讨论】:

【参考方案4】:

比较不同类型的变量(特别是字符串和数字)时,两个值都将转换为数字。因此,您的 'asdjfklhqwef' 转换为 0(数字),比较为真。

http://www.php.net/manual/en/language.operators.comparison.php

【讨论】:

谢谢。已经看过这个链接,但我有点看错了。这就是我一直在寻找的答案:)

以上是关于将 0 传递给具有默认值的函数的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 函数

只返回传递值的默认函数?

从 parquet 文件将具有默认值的数据加载到 Redshift

将 std::array 传递给函数:默认值

为 JavaScript 函数设置默认参数值

PHP 将数组传递给函数 - 如果未设置,则保持默认值