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;
}
在 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;
}