从可能不存在且没有错误的数组值中分配 PHP 变量的最快方法
Posted
技术标签:
【中文标题】从可能不存在且没有错误的数组值中分配 PHP 变量的最快方法【英文标题】:Quickest way to assign a PHP variable from an array value that may not exist without error 【发布时间】:2015-12-30 00:31:47 【问题描述】:这是一种代码高尔夫,但我不觉得它偏离主题,因为这个问题实际上在我工作时经常出现,并且保持代码简洁和可读是非常on的主题。
//$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
工作正常,但变量名称较长时会变得很长,并且难以读取大型多维数组...
[
'Foo' => 'Bar',
'Boo' => [
'FooBarMacFooBar' => ( isset($SomeOtherLongVariable['BooBarMcFooFar']) ) ? $SomeOtherLongVariable['BooBarMcFooFar'] : NULL )
] ;
]
除了丑陋和难以阅读之外,它不符合 PSR-2 的最大线宽 (80?)。
如果我这样做,飞机不会坠毁...
[
'Foo' => 'Bar',
'Boo' => [
// THIS WILL THROW AND ERROR NOTICE IF THE KEY DOESN'T EXIST
'FooBarMacFooBar' => $SomeOtherLongVariable['BooBarMcFooFar']
] ;
]
...但是如果数组的内容未知,它将在日志中填满有关“数组键不存在”的错误通知。
有解决办法吗? (另外写一个辅助函数)
(...除了使用 Ruby :-)
【问题讨论】:
在 php 7.0(发布时)中有??
运算符或“Null Coalesce Operator”。在 5.5 中,您可以将 ?:
作为类似的三元组,但仍会抛出“未定义索引”通知。除此之外,不是真的。
抑制通知(不是错误)有多糟糕?通知只是建议。考虑到它很容易检测到的所有不良做法,确实可能会在 php 中添加大量其他通知,但 php 之神似乎已经任意决定什么是足够糟糕的通知。
@Bsienn:这也会触发通知,因为未定义的元素被传递给该方法。除非参数是通过引用声明的,但随后调用具有创建元素的副作用。
【参考方案1】:
这多年来一直困扰着 PHP 开发人员,在 PHP 7 中,COALESCE 运算符 ??
终于出现了:
新方式(从 PHP 7 开始):
$variable = $array['A'] ?? null
与您的代码完全相同。
引用RFC:
添加了coalesce 或
??
运算符,如果第一个操作数存在且不是NULL
,则返回它的结果,否则返回第二个操作数。这意味着$_GET['mykey'] ?? ""
是完全安全的,不会引发E_NOTICE
旧方法(hackish 解决方法):
$variable = @$array['A'] ?: null;
这使用错误抑制运算符@
来使通知静音,并使用短三元运算符?:
。如果我们只需要将$variable
设置为null
,如果没有设置$array['A']
,则可以缩短为
$variable = @$array['A'];
需要注意的是,@
被认为是不好的做法,我实际上觉得推荐它有点脏,但如果你能忍受偶尔违反最佳做法的情况,这是没有害处的情况:
在这一行中只有一个可能发生的错误(未定义的变量/偏移量)。你期待它并优雅地处理它。
【讨论】:
天哪,我讨厌@
,但该死的,如果它有时没有帮助的话。
很好的答案! @
在 PSR-2 中被“禁止”了吗?我对此并不教条,但我很好奇当我使用 CS 嗅探器等时它是否会让我头疼
@
在 PSR-2 中没有被禁止,但有代码嗅探器会寻找它,所以这取决于您的设置:github.com/squizlabs/PHP_CodeSniffer/blob/master/CodeSniffer/…以上是关于从可能不存在且没有错误的数组值中分配 PHP 变量的最快方法的主要内容,如果未能解决你的问题,请参考以下文章