应该避免使用逻辑运算符(使用||而不是'或')sensiolabs洞察力

时间:2015-10-17 13:08:15

标签: php logical-operators

我正在使用SensioLabs Insight将我的项目代码质量保持在已使用工具的最佳实践之上。

此行在SLInsight分析期间引起警告:

$handle = fopen($file, 'w') or die('Cannot open file: '.$file);

SensioLabs说:

  

应避免使用逻辑运算符。

     

[...]

     

或运算符与||的优先级不同。这可能导致意外行为,使用||代替。

好的但是,如果我只是使用||而不是'或',像这样:

$handle = fopen($file, 'w') || die('Cannot open file: '.$file);

由于No such file or directory失败,我得到了经典的fopen错误, 而不是我期待的(死亡行动和回复信息)。

为了避免这种情况,我在执行fopen之前使用条件:

if(!file_exists($file)) {
    throw $this->createNotFoundException('Le fichier '.$file.' n\'existe pas.');
}
$handle = fopen($file'.log', 'r');

“||”有什么用处?在我想要的变量分配中?

提前感谢我的启发。

1 个答案:

答案 0 :(得分:5)

  

应避免使用逻辑运算符。

在您的情况下,是您想要的or的优先级。我认为SensioLabs指的是条件中的复杂表达式,这可能会产生误导。

or运算符的优先级较低,甚至低于赋值=运算符。例如:

if ($a = getRecordOrFalse($userId) || $boolValue) {

正如您所料:

if (($a = getRecordOrFalse($userId)) || ($boolValue)) {

$a包含返回的值getRecordOrFalse,如果true为真,则此条件为$boolValue,即使$a不是or。但是使用if ($a = getRecordOrFalse($userId) or $boolValue) { ,您会得到完全不同的行为:

if ($a = (getRecordOrFalse($userId) or $boolValue)) {

相当于:

$a

现在getRecordOrFalse($userId) or $boolValue)将是$handle = (fopen($file, 'w') or die('Cannot open file: '.$file)); 条件的结果给出的布尔值。

但在你的情况下,这是有道理的:

if (false === $handle = fopen($file, 'w')) {
    die('Cannot open file: '.$file);
}

为提高可读性,您可以采用以下条件:

if (!$handle = fopen($file, 'w')) {
    die('Cannot open file: '.$file);
}

或者只是

function time(d) {
    var k = new Array(7);
    k[0]=  "Sunday";
    k[1] = "Monday";
    k[2] = "Tuesday";
    k[3] = "Wednesday";
    k[4] = "Thursday";
    k[5] = "Friday";
    k[6] = "Saturday";

    var n = weekday[d.getDay()];
    return(n+', '+d.getHours()+':'+d.getMinutes());
}