我有一个使用一系列选项的PHP脚本:$ opts []
$ opts可以包含0个或更多键值对。所有值都是布尔值。
当检查是否存在某个键,然后该值为true时,我一直在执行以下操作:
if(isset($opts['small']) && $opts['small']) $classes .= 'smallBtn';
这很有效,但我觉得它有点长篇大论。
在考虑之后,我想出了以下替代方案:
if(@$opts['small']) $classes .= "smallBtn";
这个小得多,但依赖于@错误抑制。
我的问题是,哪种方式更好?
首先是长篇大论,但明确表达的是什么。
第二个更短,但可能被视为糟糕的编码习惯?
更新:
第三个选项,在我看来最好,是使用empty:
if(!empty($opts['small'])) $classes .= 'smallBtn';
从手册:
如果变量不存在,则不会生成警告。这意味着empty()基本上是!isset($ var)||的简洁等价物$ var == false。
答案 0 :(得分:1)
就个人而言,我更喜欢第一种方法,涉及清洁代码指南和代码可读性。
我不会在任何可能的情况下压制任何错误。
答案 1 :(得分:1)
使用@来抑制错误通常是一件坏事,因为它使调试变得非常困难。例如,假设您使用变量名称输入拼写错误(请注意双美元符号):
if(@$$opts['small']) $classes .= "smallBtn";
这将永远是假的而不会丢失任何错误。
如果您想缩短代码,可以使用一个函数,例如:
function optionIsTrue($opts, $key) {
return isset($opts[$key]) && $opts[$key] === true;
}
if (optionIsTrue($opts, "small")) {
$classes .= 'smallBtn';
}
答案 2 :(得分:1)
正确的方法是进行冗长的检查,以便永远不会发生错误。抑制错误修复了症状但未修复错误。您问题的以下摘录是正确的答案:
if(isset($opts['small']) && $opts['small']) $classes .= 'smallBtn';
您希望使代码更简短,更容易阅读,这是正确的。但我已经看到很多PHP代码由其他专家和唯一的' @'我在生产代码中见过的错误抑制是我自己作为一个快速解决方案。经过同事的惩罚后,我立即进行了适当的冗长检查,以免错误发生。
答案 3 :(得分:0)
我发表了评论,但你看不出差异,这里有: 好吧,根据PEAR Coding Standards你应该简单地说,首先是一个更好的方法,但是为了最好的实践,并且在看完之后为了最好的理解,试着读一下:
if(isset($opts['small'])
&& $opts['small']
) {
$classes .= 'smallBtn';
}
就我所知,你永远不应该压制错误