Assign if variable is set

In PHP I find myself writing code like this frequently:

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

Is there a simpler way to do this? Preferably one that doesn't require me to write $the->very->long->variable[$index] twice.


Sadly no, because the RFC has been declined. And because isset is not a function but a language construct you cannot write your own function for this case.

Note: Because this is a language construct and not a function, it cannot be called using variable functions.


An update, because PHP 7 is now out and is a game-changer on this point ; the previous answers are about PHP 5.

PHP 7 solves this issue. Because you are true at saying that it is frequent to write this in PHP, and that's absolutely not elegant.

In PHP 7 comes the Null Coalesce Operator (RFC), which is a perfect shorthand for the isset ternary condition.

Its goal is to replace this type of condition:

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

By that:

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

Even better, the null coalesce operators are chainable:

$x = null;
# $y = null; (undefined)
$z = 'fallback';

# PHP 7
echo $x ?? $y ?? $z   #=> "fallback"

# PHP 5
echo isset($x) ? $x : (isset($y) ? $y : $z)

The null coalesce operator acts exactly like isset() : the subject variable's value is taken if:

  • The variable is defined (it exists)
  • The variable is not null
  • Just a note for PHP beginners: if you use the ternary condition but you know that the subject variable is necessarily defined (but you want a fallback for falsy values), there's the Elvis operator:

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

    With the Elvis operator, if $dict['optional'] is an invalid offset or $dict is undefined, you'll get a E_NOTICE warning (PHP 5 & 7). That's why, in PHP 5, people are using the hideous isset a ? a : b form when they're not sure about the input.


    Assuming you know that $the->very->long->variable is set, and you're just worried about the array index....

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

    Or for a more generic variant that you can use around you code:

    function array_valifset($arr,$k, $default=null) {
        return isset($arr[$k]) ? $arr[$k] : $default;
    }
    

    then call it like this for any array value:

    $a = array_valifset($the->very->long->variable,$index);
    
    链接地址: http://www.djcxy.com/p/57720.html

    上一篇: 什么? 签署此声明?

    下一篇: 如果设置了变量,则分配