在 PHP 中,我发现自己经常编写这样的代码:
$a = isset($the->very->long->variable[$index])
? $the->very->long->variable[$index]
: null;
有没有更简单的方法来做到这一点?最好是不需要我写$the->very->long->variable[$index]
两次的。
一个更新,因为 PHP 7 现已推出,并且在这一点上改变了游戏规则;前面的答案是关于 PHP 5 的。
PHP 7 解决了这个问题。因为您确实说用 PHP 编写它很常见,而且这绝对不优雅。
PHP 7 中出现了Null Coalesce Operator (RFC),它是 isset 三元条件的完美简写。
它的目标是替换这种类型的条件:
$var = isset($dict['optional']) ? $dict['optional'] : 'fallback';
由此:
$var = $dict['optional'] ?? 'fallback';
更好的是,空合并运算符是可链接的:
$x = null;
# $y = null; (undefined)
$z = 'fallback';
# PHP 7
echo $x ?? $y ?? $z #=> "fallback"
# PHP 5
echo isset($x) ? $x : (isset($y) ? $y : $z)
空合并运算符的行为与isset()
: 在以下情况下采用主题变量的值:
只是给 PHP 初学者的注意事项:如果您使用三元条件,但您知道必须定义主题变量(但您想要一个假值的后备),则有Elvis 运算符:
$var = $dict['optional'] ?: 'fallback';
使用Elvis 运算符,如果$dict['optional']
是无效偏移量或$dict
未定义,您将收到E_NOTICE
警告(PHP 5 和 7)。这就是为什么在 PHP 5 中,人们使用可怕的isset a ? a : b当他们不确定输入时形成。
假设您知道$the->very->long->variable
已设置,并且您只是担心数组索引....
$x = $the->very->long->variable;
$a = isset($x[$index]) ? $x[$index] : null;
或者对于您可以在代码周围使用的更通用的变体:
function array_valifset($arr,$k, $default=null) {
return isset($arr[$k]) ? $arr[$k] : $default;
}
然后像这样对任何数组值调用它:
$a = array_valifset($the->very->long->variable,$index);
如果您只分配null
而不是未设置的变量,则可以使用:
$a = @$the->very->long->variable[$index];
@
使该指令不抛出任何错误
我偶然发现了同样的问题,发现引用数组元素不会发出通知或警告,但会返回 null(至少 PHP 5.6)。
$foo = ['bar' => 1];
var_dump($bar = &$foo['bar']); // int 1
var_dump($baz = &$foo['baz']); // null
在 if 语句中:
if($bar = &$foo['bar']) {
echo $bar;
}
if($baz = &$foo['baz']) {
echo $baz;
}