9

从 PHP 数组中提取可能缺失的值时可以使用 @ 吗?例子:

$value = @$array['possibly_missing_key'];

预期的行为:

if (isset($array['possibly_missing_key'])) {
    $value = $array['possibly_missing_key'];
} else {
    $value = null;
}

我想知道,在传播使用模式之前。

4

6 回答 6

8

@操作员抑制错误消息,并使用它可能会为您的代码设置其他错误和最终难以追踪的意外行为。因此,它肯定是一种反模式。

因此,我非常喜欢第二位。它使它更清晰

  • 它可能不存在于数组中,并且
  • 如果不存在,默认值是什么

为了使其更简洁,您可以使用三元条件运算符?:,如Mark Ba​​ker 的回答所示。代码略少,符号更多,但含义已广为人知。

于 2010-12-14T16:34:33.280 回答
7

实际上,isset变化是反模式。如果您只是isset($var)?$var:NULL为了抑制“错误”而使用,那么使用正确的语法来抑制错误将一无所获。它具有相同的结果,但可读性较差。

人们为此争论不休是因为感知到的“清洁度”,并且因为使用 isset 是一种微优化。避免@和使用 isset 作为语法盐替代品只是货物崇拜编程。

于 2010-12-14T16:43:21.783 回答
4

或者

$value = (isset($array['possibly_missing_key'])) ? $array['possibly_missing_key']: null;
于 2010-12-14T16:35:29.410 回答
1

忽略警告绝对是一种反模式;所以是的,这是一种反模式(我可以保证,如果你学会抑制警告,其中一个会回来咬你,如果不是更糟的话)。

此外,虽然第二个版本更冗长,但它为未初始化的变量提供了一个已知状态(或者可以用来处理问题,如果该变量应该被填充)。

于 2010-12-14T16:37:14.540 回答
1

第三种选择:

$value = (isset($array['key']) ? $array['key'] : null);

我知道这并不能直接回答问题;我会把它作为评论,但它确实需要格式化。

这里的想法是,如果您试图通过使用单行而不是 if-else 块来缩短代码,那么您仍然可以使用三元运算符将其变成简洁的单行,为您提供最好的两个世界的。

于 2010-12-14T16:38:20.447 回答
1

第二个代码块(或 Mark Ba​​ker 的替代方案,其工作方式完全相同)更好。我不完全确定 PHP,但在许多其他编程语言中,简单地忽略变量几乎肯定会引发错误。至少在第二个块中,您将变量初始化为某个值或内存位置。

如果您希望函数在最终产品中抛出预期的错误,则应该更常使用错误抑制(但是,很多时候情况并非如此)。

祝你好运!
丹尼斯 M。

于 2010-12-14T16:39:51.177 回答