有些人知道,C# 有非常有用的 ??
运算符,如果左边的表达式为空,它会计算并返回右边的表达式。它对于提供默认值非常有用,例如:
int spaces = readSetting("spaces") ?? 5;
如果 readSetting
找不到 "spaces"
并返回 null,变量 spaces
将保持默认值 5
.
您可以使用 ||
运算符在 JavaScript 和 Ruby 中执行几乎相同的操作,如
var spaces = readSetting("spaces") || 5;
尽管在这种情况下,在 JavaScript 中您不能将 0
作为 spaces
的值,而在 Ruby 和 JavaScript 中都不能将 false
作为值。
PHP 有 or
运算符,虽然它不像 ||
那样工作,因为它不会从右边返回表达式,但它仍然很有用这里:
$spaces = readSetting('spaces') or $spaces = 5;
注意 ""
和 "0"
除了 false, 0 之外,在 PHP 中也被视为
和 false
null
在大多数语言中。
问题是,我应该使用上面的构造吗?除了将大类字符视为假字符外,它是否有副作用? PHP 社区通常使用和推荐此任务的更好构造吗?
最佳答案
在这种情况下更明确一点是个好主意,尤其是在 PHP 中,因为它的类型转换规则有些令人困惑(例如,正如您指出的,“0”是假的)。
如果你想严格一点,让你的函数 readSettings
返回正确的设置,如果没有找到设置,则返回一个明确定义的值,例如空
。那么你应该将它用作:
$spaces = readSettings('spaces');
if (null === $spaces) {
$spaces = 5;
}
如果你想更慷慨并且只希望 $spaces 不为空,请使用:
$spaces = readSettings('spaces');
if (empty($spaces)) { // or: if (!$spaces) {
$spaces = 5;
}
你可以通过第二次函数调用或丑陋的构造来缩短它(不推荐):
$spaces = readSettings('space') ? readSettings('space') : 5;
$spaces = ($x = readSettings('space')) ? $x : 5; // UGLY!
但是请注意您是否希望 0
成为 $spaces
的有效值!
来自Zen of Python :
Explicit is better than implicit.
在你的情况下,我建议只向 readSettings()
添加第二个参数 $default
:
function readSettings($key, $default=null) {
return isset($settings[$key]) ? $settings[$key] : $default;
}
$spaces = readSettings('spaces', 5);
关于PHP 和 ??运算符(operator),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/634540/