PHP 检查是否存在 + 布尔值时抑制错误?

PHP suppress errors when checking existence + value of boolean?

我有一个 PHP 使用一系列选项的脚本:$opts[]

$opts 可以包含 0 个或多个键值对。所有值都是布尔值。

当检查一个键是否存在,然后该值是否为真时,我一直在做以下事情:

if(isset($opts['small']) && $opts['small']) $classes .= 'smallBtn';

这个可以,但是我觉得有点啰嗦。

经过深思熟虑,我想到了以下替代方案:

if(@$opts['small']) $classes .= "smallBtn";

这要小得多,但依赖于@错误抑制。

我的问题是,哪种方法更好?

首先是啰嗦,但明确说明了它在做什么。

第二个更短,但可能被视为糟糕的编码习惯?

更新:

第三个选项,也是我认为最好的选项,是使用 empty:

if(!empty($opts['small'])) $classes .= 'smallBtn';

来自手册:

No warning is generated if the variable does not exist. That means empty() is essentially the concise equivalent to !isset($var) || $var == false.

清洁代码指南代码可读性而言,我个人更喜欢第一种方法。

我不会尽可能抑制任何错误。

使用 @ 来抑制错误通常是一件坏事,因为它会使调试变得非常困难。例如,假设您在变量名中输入错误(注意双美元符号):

if(@$$opts['small']) $classes .= "smallBtn";

这将始终为 false 而不会引发任何错误。

如果你想缩短你的代码,也许只需要使用一个函数,比如:

function optionIsTrue($opts, $key) {
    return isset($opts[$key]) && $opts[$key] === true;
}

if (optionIsTrue($opts, "small")) {
    $classes .= 'smallBtn';
}

我发表了评论,但你看不出有什么不同,这里是: 好吧,根据 PEAR Coding Standards 你应该简单地说,第一个是更好的方法,但为了最好的练习,并且为了在看完之后最好地理解,请尝试阅读这个:

if(isset($opts['small']) 
   && $opts['small'] 
) {
     $classes .= 'smallBtn'; 
}

据我所知,你永远不应该抑制错误

正确的方法是进行冗长的检查,这样错误就不会发生。抑制错误可以修复症状,但不能修复错误。以下摘录自您的问题是正确答案:

if(isset($opts['small']) && $opts['small']) $classes .= 'smallBtn';

您希望使代码更短且更易于阅读,这是正确的。但是我已经看到很多 PHP 代码是由其他专家完成的,而我在生产代码中看到的唯一一个 '@' 错误抑制是我自己放在那里作为快速修复的。被同事责骂后,我及时进行了适当的冗长检查,所以没有发生错误。