将 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 传递给具有默认值的函数的主要内容,如果未能解决你的问题,请参考以下文章