Требуются ли скобки в PSR-2 PHP-синтаксисе?

Вопрос: нужны ли скобки в PSR-2 PHP-синтаксисе?

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

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

ИЛИ

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


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


Вывод

Если на этом нет стандарта PSR-2, каким образом это наиболее распространенное соглашение?

    В стандарте PSR-2 конкретно отсутствует мнение операторов:

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

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

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

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

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

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

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

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

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

    Здесь оператор конкатенации ( . Operator) фактически вычисляется перед тернарным оператором, поэтому условие всегда является непустой строкой (начало '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 идет таким образом, что

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

    Кажется более чистым, чем круглые скобки.

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

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

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

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

    Сниффер кода

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

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

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