PHP 和 ??运算符(operator)

标签 php

有些人知道,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/

相关文章:

php - IMAP编码解码: UTF-8 issue

php - Yii2 #403 错误仅在 IE 中出现,并且在兼容性 View 模式打开时也会出现

php - 在核心 php 元素中动态地从 LTR 到 RTL

php - 为什么mysql查询只返回一行

php - PHP 中的契约式编程

php - 使用具有设置类型列的多对多 mysql 关系是否有如此缺点?

php 和 ruby​​ 脚本访问相同的数据库和表会导致损坏吗?

php - 如何将图像从mysql放到php表格单元格中

javascript - 如何使用其他下拉列表中未选择的选项填充下拉列表?

php - 如何将所有相对图像路径替换为绝对路径形式的 css