Ищете, какой (если любой из) синтаксис следующего синтаксиса соответствует 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';