分配if变量是否已设置

时间:2012-11-29 13:01:59

标签: php variables

在PHP中,我发现自己经常编写这样的代码:

$a = isset($the->very->long->variable[$index])
            ? $the->very->long->variable[$index]
            : null;

有更简单的方法吗?最好不要求我两次写$the->very->long->variable[$index]

5 个答案:

答案 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)

可悲的是,因为RFC被拒绝了。因为isset不是函数而是语言构造,所以你不能为这种情况编写自己的函数。

  

注意:因为这是一种语言结构而不是函数,所以不能使用变量函数调用它。

答案 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;
}