Следует избегать логических операторов (используйте || вместо ‘или’) sensiolabs insight

Я использую SensioLabs Insight, чтобы поддерживать качество кода моих проектов на уровне лучших практик используемого инструмента.

Эта строка вызывает предупреждение во время анализа SLInsight:

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

SensioLabs говорят:

Логических операторов следует избегать.

[…]

Оператор or не имеет того же приоритета, что и ||. Это может привести к неожиданному поведению, используйте || вместо.

Хорошо, но если я просто использую || вместо ‘или’, вот так:

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

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

Спасибо заранее за просветление меня.

2

Решение

Логических операторов следует избегать.

В вашем случае это приоритет 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);
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]