28

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

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

有没有更简单的方法来做到这一点?最好是不需要我写$the->very->long->variable[$index]两次的。

4

5 回答 5

54

一个更新,因为 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当他们不确定输入时形成。

于 2015-08-11T19:58:09.753 回答
10

遗憾的是没有,因为RFC已被拒绝。而且因为isset不是一个函数,而是一个语言结构,所以你不能为这种情况编写自己的函数。

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

于 2012-11-29T13:05:16.810 回答
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);
于 2012-11-29T13:09:11.213 回答
1

如果您只分配null而不是未设置的变量,则可以使用:

$a = @$the->very->long->variable[$index];

@使该指令不抛出任何错误

于 2017-08-29T20:35:51.893 回答
-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;
}
于 2015-01-14T17:57:26.693 回答