PHP检查存在时的错误+布尔值?

时间:2015-02-27 09:33:58

标签: php coding-style refactoring

我有一个使用一系列选项的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。

4 个答案:

答案 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'; 
}

就我所知,你永远不应该压制错误