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 代码是由其他专家完成的,而我在生产代码中看到的唯一一个 '@' 错误抑制是我自己放在那里作为快速修复的。被同事责骂后,我及时进行了适当的冗长检查,所以没有发生错误。
我有一个 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 代码是由其他专家完成的,而我在生产代码中看到的唯一一个 '@' 错误抑制是我自己放在那里作为快速修复的。被同事责骂后,我及时进行了适当的冗长检查,所以没有发生错误。