如果设置了变量,则赋值

2022-08-30 14:47:16

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

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

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


答案 1

一个更新,因为PHP 7现在已经出来了,在这一点上是一个游戏规则的改变者;前面的答案是关于 PHP 5 的。

PHP 7 解决了这个问题。因为你说用PHP写这个是很常见的,这绝对不优雅。

在 PHP 7 中出现了空合并运算符 (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初学者来说,只是一个注意事项:如果您使用三元条件,但您知道必须定义主题变量(但您希望对falsy值进行回退),则有Elvis运算符

$var = $dict['optional'] ?: 'fallback';

使用 Elvis 运算符,如果偏移量无效或未定义,您将收到警告(PHP 5 和 7)。这就是为什么在 PHP 5 中,当人们不确定输入时,会使用可怕的 isset a ? a : b 形式。$dict['optional']$dictE_NOTICE


答案 2

可悲的是没有,因为RFC已被拒绝。由于 isset 不是函数,而是语言构造,因此无法为这种情况编写自己的函数。

注意:由于这是一种语言构造而不是函数,因此不能使用变量函数调用它。


推荐