2015-10-17 1 views
2

Я использую SensioLabs Insight, чтобы сохранить качество моих проектов над лучшими практиками использованного инструмента.Следует избегать логических операторов (использовать || вместо «или») 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 ERRO из fopen терпят неудачу, вместо того, что я ожидал (умереть действие и вернуться сообщение).

Чтобы избежать этого, я использую это состояние, прежде чем сделать fopen:

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

Что такое хорошее использование «||» в переменной назначения для чего я хочу?

Спасибо заранее, чтобы просветить меня.

ответ

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) «s.

Но в вашем случае это имеет смысл:

$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); 
}