Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php @$array[';可能#缺少#键';]是反模式吗?_Php_Arrays_Operators_Error Suppression - Fatal编程技术网

Php @$array[';可能#缺少#键';]是反模式吗?

Php @$array[';可能#缺少#键';]是反模式吗?,php,arrays,operators,error-suppression,Php,Arrays,Operators,Error Suppression,从PHP数组中提取可能缺少的值时使用@可以吗?例如: $value = @$array['possibly_missing_key']; 预期行为: if (isset($array['possibly_missing_key'])) { $value = $array['possibly_missing_key']; } else { $value = null; } 在传播使用模式之前,我想知道。操作符会抑制错误消息,并且使用它可能会为其他错误和意外行为设置代码,这些错误

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

$value = @$array['possibly_missing_key'];
预期行为:

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

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

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

因此,我更喜欢第二点。这使它更清楚

  • 它可能不在数组中,并且
  • 如果不存在,默认值是什么
为了使其更简洁,可以使用三元条件运算符
?:
,如中所示。代码稍微少一些,符号多一些,但其含义是公认的。

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

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

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

第三个选项:

$value = (isset($array['key']) ? $array['key'] : null);
我知道这并不能直接回答这个问题;我会把它作为一个评论,除非它真的需要格式化

这里的想法是,如果您试图通过使用一个一行程序而不是if-else块来缩短代码,那么您仍然可以使用三元运算符将其转换为一个简洁的一行程序,从而实现两个方面的最佳效果。

第二个代码块(或马克·贝克的替代方案,其工作原理完全相同)更好。我不完全确定PHP,但在许多其他编程语言中,忽略一个变量几乎肯定会抛出一个错误。至少在第二个块中,您正在将变量初始化为某个值或内存位置

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

祝你好运

Dennis M.

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


人们之所以支持这一点,是因为人们感觉到了“清洁”,而且使用isset是一种微观优化。避免使用
@
并使用isset作为语法盐替换只是cargo cult编程。

+1如果使用PHP>=5.3,则可以使用新的较短形式:
isset($array['mably_missing_key']):null
@webbiedave:不,这将返回isset(…)的结果,而不是实际的数组值。@webbiedave:在这种情况下,该短版本有效吗?它不会返回
isset()
(即true或false)的值而不是变量本身吗?突然,我渴望在C#……噢,snap中找到null合并运算符(
someVar??someDefaultValue
)!好吧,我会留下评论,这样他可以看到更简短的形式供将来使用。这不是第三个选项,这是选项2的不同格式(因为它的功能相同)。你会说,
if(x){something}
if(!x){}else{something}
是两种不同的解决方案,因为它们的编写方式不同吗?@Piskvor-hm,这有点挑剔。这是不同的语法,所以我想说是的,这是第三个选项,即使它实际上与他的原始代码相同。但我的观点是提供一种不使用
@
的单行方法,因为这似乎是他的问题所在。嗯,我对此有点犹豫。语法是不同的,但它做同样的事情。您是对的,它不那么冗长,同时保留了功能。(我想这更多地说明了我挑剔的冲动,而不是手头的问题;))我是唯一一个用isset代替isset的人吗?(旁注)
isset
没有检测到可能丢失的钥匙。使用
array\u key\u exists
进行此操作。尝试
$arr=array('notMissing'=>NULL)
with
isset
@AlexV@Gordon:我认为这不重要,因为默认值无论如何都是空的:P@AlexV-可能是微优化,我知道,但我发现isset()比array_key_exists()更快。。。可能是因为它是一个语言构造而不是一个函数(有所有相关的函数调用开销),我在这一点上支持@AlexV。缺少的密钥和值为
NULL
的现有密钥之间存在语义差异,感谢您提到了一种相反的观点。@IvoDanihelka:事实上,我想撤退,并添加一个大的密钥,这一切都取决于此。没有一个模式匹配所有用例。灵活变通,不要迷信isset/@,为手头的工作使用最好的工具。我理解。safe@用法可能会误导其他开发人员在错误的地方使用它。