PHP:这样做||那个(比如 javascript)

PHP: do this || that (like javascript)

在 javascript 中,如果第一个操作失败,我们可以使用 || 执行第二个操作,例如:

function getObject(id_or_object) {
    var obj = document.getElementById(id_or_object) || id_or_object;
    return obj;
}

我们如何在 PHP 中做到这一点?

如果我们不能,我可以发誓我在 PHP 中看到过这样使用 ||。这是什么意思?

我想做:

function fix_item($item) {
    $item['armor'] = $item['armor'] || 0;
    return $item;
}

但这不起作用,所以我正在使用

function fix_item($item) {
    if (!isset($item['armor'])) $item['armor'] = 0;
    return $item;
}

,但我不喜欢第二种方法。有什么想法吗?

如果您使用的是 php 7,则可以使用空合并运算符

$a ?? $b ?? $c 

此计算结果为第一个非空值。这与 || 非常相似来自 javascript.

您可以使用 || (OR) 进行 true/false 比较,但是(这是已知的(有争议的)设计错误之一)在 PHP 中设计:短路不会 return 操作数的值(正如您在 javascript-逻辑示例中所做的那样),而是布尔结果。

这意味着:
$item['armor'] = $item['armor'] || 0; 无法按预期工作(就像 javascript 中那样)。
相反,它会将 $item['armor'] 设置为布尔值 true/false (取决于 $item['armor'] || 0 的结果)。

但是,可以使用 'lazy evaluation' 的方式与在 javascript:
中的使用方式类似 isset($item['armor']) || $item['armor'] = 0;
(添加 isset 以防止出现 Undefined variable 错误)。
它仍然清楚地描述了您的意图,您不需要使用 ! 反转布尔 isset 结果(这对于 if&& 是必要的(AND)).

或者,也可以这样做:
$item['armor'] = $item['armor'] OR $item['armor'] = 0;(注意这会给出一个 E_NOTICE
(我觉得可读性不太好),

或三元:
$item['armor'] = isset($item['armor']) ? $item['armor'] : 0;
(具有 'better'/'more common' 可读性,但增加了代码大小)。

对于 PHP7 及以上,请参阅 的回答。

这测试 $item['armor'],如果它是真的 returns 右边的是什么?运算符,如果为假,它 returns 紧靠 : 右边的内容(我也在 javascript 中使用了三元运算符)。

function fix_item($item) {
    $item['armor'] = $item['armor'] ? $item['armor'] : 0;
    return $item;
}