在 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 operator:
$var = $dict['optional'] ?: 'fallback';
使用Elvis运算符,如果$dict['optional']
是无效的偏移量或$dict
未定义,则会收到一个E_NOTICE
警告(PHP 5和7)。这就是为什么在PHP 5中,人们在不确定输入时使用丑陋的isset a ? a : b形式。
如果你只是将 null
赋值给未设置的变量,可以使用以下代码:
$a = @$the->very->long->variable[$index];
@
符号可以让该指令不产生错误。
$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(至少在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;
}
E_STRICT | E_ALL)
。 - Elias Van Ootegem$ref = $the->very->long->variable; $a = !empty($ref[$index]) ? $ref[$index] : null; $b = !empty($ref[++$index])...
,或者如@Bondye所指出的那样,使用魔术获取器方法,并将其设置为返回null或属性值。 - Elias Van Ootegem->variable
可以实现/封装到ArrayAccess
,并在offsetGet
操作中对未设置的索引默认返回NULL。- 还请仔细检查潜在的重复内容,你可能会在这个网站上找到一些宝贵的信息。 - hakre