Я использую 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');
Какая польза от «||» в присваивании переменной для чего я хочу?
Спасибо заранее за просветление меня.
Логических операторов следует избегать.
В вашем случае это приоритет 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);
}
Других решений пока нет …