分配if变量是否已设置

oz1*_*1cz 23 php variables

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

$a = isset($the->very->long->variable[$index])
            ? $the->very->long->variable[$index]
            : null;
Run Code Online (Sandbox Code Playgroud)

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

Mor*_*ing 34

一个更新,因为PHP 7现在已经出局,并且在这一点上是一个改变游戏规则的人.以前的答案是关于PHP 5.

PHP 7解决了这个问题.因为你说在PHP中经常写这个是真的,这绝对不是优雅的.

在PHP 7中出现了Null Coalesce Operator(RFC),它是isset三元条件的完美缩写.

它的目标是取代这种类型的条件:

$var = isset($dict['optional']) ? $dict['optional'] : 'fallback';
Run Code Online (Sandbox Code Playgroud)

那个:

$var = $dict['optional'] ?? 'fallback';
Run Code Online (Sandbox Code Playgroud)

更好的是,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)
Run Code Online (Sandbox Code Playgroud)

null coalesce运算符的行为如下isset():如果出现以下情况,则采用主题变量的值:

  • 变量已定义(存在)
  • 变量不为null

只是PHP初学者的一个注释:如果你使用三元条件,但你知道主题变量必须定义(但你想要为falsy值回退),那就是Elvis运算符:

$var = $dict['optional'] ?: 'fallback';
Run Code Online (Sandbox Code Playgroud)

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


eis*_*erg 10

可悲的是,因为RFC已被拒绝.因为isset不是一个函数而是一个语言结构,你不能为这种情况编写自己的函数.

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