从PHP数组中提取可能缺少的值时,是否可以使用@?例如:
$value = @$array['possibly_missing_key'];
预期行为:
if (isset($array['possibly_missing_key'])) {
$value = $array['possibly_missing_key'];
} else {
$value = null;
}
我想知道,在传播使用模式之前。
答案 0 :(得分:8)
@
运算符会禁止显示错误消息,并使用它可能为其他错误和意外行为设置代码,最终难以追踪。因此,它肯定是反模式。
因此,我非常喜欢第二位。它让它更清晰
为了使其更简洁,您可以使用三元条件运算符?:
,如Mark Baker's answer中所示。稍微少的代码和更多的符号,但其含义是公认的。
答案 1 :(得分:6)
实际上isset
变体是反模式。如果您只是使用isset($var)?$var:NULL
来抑制"错误",那么您在使用正确的语法来抑制错误方面一无所获。它具有相同的结果,但可读性较差。
人们正在为此而争论,因为他们认为清洁"因为使用isset是微优化。避免使用@
并使用isset作为语法盐替换只是货物编程。
答案 2 :(得分:4)
或者
$value = (isset($array['possibly_missing_key'])) ? $array['possibly_missing_key']: null;
答案 3 :(得分:1)
忽略警告绝对是反模式;所以是的,这是一个反模式(我可以保证,如果你学会压制警告,其中一个会回来并在后方咬你,如果不是更糟)。
此外,虽然第二个版本更详细,但它为未初始化的变量提供了一个已知状态(或者可以用来处理问题,如果该变量应该被填充)。
答案 4 :(得分:1)
第三种选择:
$value = (isset($array['key']) ? $array['key'] : null);
我知道这并没有直接回答这个问题;我会把它作为评论,除非它真的需要格式化。
这里的想法是,如果你试图通过使用单行代码而不是if-else块来缩短你的代码,那么你仍然可以使用三元运算符将它变成简洁的单行代码,你是两全其美的。
答案 5 :(得分:1)
第二个代码块(或Mark Baker的替代方案将完全相同)更好。我不完全确定PHP,但在许多其他编程语言中,简单地忽略变量几乎肯定会引发错误。至少在第二个块中,您将变量初始化为某个值或内存位置。
如果您希望函数在最终产品中抛出预期的错误,则应该更常使用错误抑制(但是,大多数时候情况并非如此)。
祝你好运!