从数组值中分配PHP变量的最快方法,可能不存在错误

eme*_*his 8 php arrays coding-style variable-assignment

这是一种代码高尔夫,但我觉得这不是主题,因为问题实际上是在我工作时经常出现的,并且保持代码简洁和可读是非常关键话题.

//$array = ['A' => 'FOO', 'B' => 'BAR'];
//We don't necessarily know what this is

// :-)
$variable = ( isset($array['A']) ) ? $array['A'] : NULL ); 
//We just want $variable to be NULL if the key isn't in the array
Run Code Online (Sandbox Code Playgroud)

工作正常,但变长名称等变得很长,这使得很难读取大型多维数组......

[
    'Foo' => 'Bar',
    'Boo' => [
         'FooBarMacFooBar' => ( isset($SomeOtherLongVariable['BooBarMcFooFar']) ) ? $SomeOtherLongVariable['BooBarMcFooFar'] : NULL )
     ] ; 
]
Run Code Online (Sandbox Code Playgroud)

除了丑陋且难以阅读之外,它不符合PSR-2的线宽最大值(80?).

如果我这样做,飞机不会崩溃......

[
    'Foo' => 'Bar',
    'Boo' => [
         // THIS WILL THROW AND ERROR NOTICE IF THE KEY DOESN'T EXIST
         'FooBarMacFooBar' => $SomeOtherLongVariable['BooBarMcFooFar']
     ] ; 
]
Run Code Online (Sandbox Code Playgroud)

...但是如果数组的内容未知,它将填充日志,并显示有关"数组键不存在"的错误通知.

这个问题有方法解决吗?(除了编写辅助函数)

(...除了使用Ruby :-)

Fab*_*ler 5

多年来一直困扰着PHP开发人员,在PHP 7中,COALESCE运营商??终于到了:

新方法(从PHP 7开始):

$variable = $array['A'] ?? null
Run Code Online (Sandbox Code Playgroud)

与您的代码完全相同.

引用RFC:

??添加了coalesce,或者运算符,如果它存在且不存在,则返回其第一个操作数的结果NULL,否则返回其第二个操作数.这意味着它$_GET['mykey'] ?? ""是完全安全的,不会提高E_NOTICE

旧的方式(hackish workaround):

$variable = @$array['A'] ?: null;
Run Code Online (Sandbox Code Playgroud)

这使用错误抑制运算符@来静音通知和短三元运算符?:.如果我们只需要设置$variablenullif $array['A']未设置,则可以缩短为

$variable = @$array['A'];
Run Code Online (Sandbox Code Playgroud)

应该注意的是,这@被认为是不好的做法,我实际上觉得它有点脏,但如果你能忍受偶尔的最佳做法违规,这是一种不会造成伤害的情况:

此行中可能发生一个可能的错误(未定义的变量/偏移量).你期待它并优雅地处理它.

  • 上帝,我讨厌`@`,但该死的,如果它有时没用. (2认同)