Обязательны ли скобки в троичном синтаксисе PHP PSR-2?

Вопрос: обязательны ли скобки в троичном синтаксисе PHP PSR-2?

Чтобы выяснить, какой (если таковой имеется) синтаксис следующего троичного оператора соответствует PSR-2, мне также нужно указать на документацию или какую-то ссылку на авторитет:

$error = ($error_status) ? 'Error' : 'No Error';

ИЛИ ЖЕ

$error = $error_status ? 'Error' : 'No Error';


Примечание: php.net показывает синтаксис с круглыми скобками, но я не смог найти его ни в одном из официальных документов PSR-2.


Заключение

Если в этом отношении нет стандарта PSR-2, какой способ является наиболее распространенным?

4 ответа

Решение

Стандарт PSR-2 специально не учитывает мнение операторов:

Есть много элементов стиля и практики, намеренно опущенных в этом руководстве. Они включают, но не ограничиваются: ... Операторы и назначение

Так как скобки используются для группировки выражений, ваш пример не имеет особого смысла:

$error = ($error_status) ? 'Error' : 'No Error';

Здесь нет смысла заключать в скобки одну переменную. Сложные условия могут извлечь пользу из скобок, но в большинстве случаев они будут только для удобства чтения.

Более распространенным примером было бы всегда окружать все троичное выражение:

$error = ($error_status ? 'Error' : 'No Error');

Основным мотивом для этого является то, что троичный оператор в PHP имеет довольно неловкую ассоциативность и приоритет, поэтому его использование в сложных выражениях часто дает неожиданные / бесполезные результаты.

Распространенным случаем является конкатенация строк, например:

$error = 'Status: ' . $error_status ? 'Error' : 'No Error';

Здесь конкатенация (. оператор) фактически вычисляется перед тернарным оператором, поэтому условие всегда является непустой строкой (начало 'Status: '), и вы всегда получите строку Error' в результате.

Скобки необходимы для предотвращения этого:

$error = 'Status: ' . ($error_status ? 'Error' : 'No Error');

Похожая ситуация возникает, когда "составление" троичных выражений для формирования эквивалента цепочки if-elseif, поскольку ошибка в начале истории PHP означает, что несколько тернарных операторов вычисляются в последовательности слева направо, а не сокращают всю ложную ветвь, когда условие правда.

Пример из руководства по PHP объясняет это более четко:

// on first glance, the following appears to output 'true'
echo (true?'true':false?'t':'f');

// however, the actual output of the above is 't'
// this is because ternary expressions are evaluated from left to right

// the following is a more obvious version of the same code as above
 echo ((true ? 'true' : false) ? 't' : 'f');

 // here, you can see that the first expression is evaluated to 'true', which
 // in turn evaluates to (bool)true, thus returning the true branch of the
 // second ternary expression.

Важно помнить, что PSR-2 утверждает, что строки НЕ ДОЛЖНЫ быть длиннее 80 символов.
Тройной синтаксис иногда может быть довольно длинным, поэтому я думаю, что у нас отсутствует рекомендация для очень распространенного вида кода. То, что я делаю в настоящее время, делает отступ таким образом:

$stuff = $count > MyLongNamespace\MyLongClassName->get('count') 
    ? 'yikes this seems to be some large stuff'
    : 'erm this is rather small stuff';

Общее соглашение всегда упрощается. Стандарт PSR идет так, что

$error = $error_status ? 'Error' : 'No Error';

Кажется, чище, чем скобки.

Если вы хотите явно повысить удобочитаемость, стандарт PSR-2 будет следующим:

if ($error_status) {
    $error = 'Error';
else {
    $error = 'No Error';
}

Это все. PSR - это стандарт для лучшего понимания нашего кода: когда вы пишете код, который вы предоставляете, вы углубляетесь в упрощение и не ограничиваете свое воображение, просто старайтесь не превышать правила PSR.

Используйте PHP Code Sniffer для проверки вашего кода по правилам PSR1 и PSR2.

Code Sniffer

Если это не указано явно, тогда нет никакого стандарта. Либо работает.

Некоторые смешанные мнения по этому поводу, и это, к сожалению, произвольно.

То, что кажется мне более общим из того, что я видел и чему научился, лучше всего объяснить, отметив различия, приведенные ниже, более конкретно; как скобки не перемещаются в любом случае.

Длинная рука:

if ($is_full_page) {
  echo "medium-6";
} else {
  echo "medium-7";
}

Короткая рука:

echo ($is_full_page) ? 'medium-6' : 'medium-7';

Тот; мне; это истинная последовательность во всей ее красоте.

Другие вопросы по тегам