在PHP中,我发现自己经常编写这样的代码:
$a = isset($the->very->long->variable[$index])
? $the->very->long->variable[$index]
: null;
有更简单的方法吗?最好不要求我两次写$the->very->long->variable[$index]
。
答案 0 :(得分:31)
更新,因为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';
更好的是,null coalesce运算符是可链接的:
$x = null;
# $y = null; (undefined)
$z = 'fallback';
# PHP 7
echo $x ?? $y ?? $z #=> "fallback"
# PHP 5
echo isset($x) ? $x : (isset($y) ? $y : $z)
null coalesce运算符的行为与isset()
完全相同:在以下情况下采用主题变量的值:
对于PHP初学者来说只是一个注释:如果你使用三元条件,但你知道主题变量必须定义(但你想要 falsy 值的后备),那就是{{3} }:
$var = $dict['optional'] ?: 'fallback';
使用 Elvis运算符,如果$dict['optional']
是无效偏移量或$dict
未定义,则会收到E_NOTICE
警告(PHP 5& 7)。这就是为什么在PHP 5中,人们正在使用可怕的 isset a? a:b 形式,当他们不确定输入时。
答案 1 :(得分:10)
答案 2 :(得分:1)
假设您知道$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);
答案 3 :(得分:1)
如果您只指定null
而不是非设置变量,则可以使用:
$a = @$the->very->long->variable[$index];
@
使该指令不会出错
答案 4 :(得分:-1)
我遇到了同样的问题,发现引用数组元素不会发出通知或警告但返回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;
}