Чтобы выяснить, какой (если любой) синтаксис следующего троичного оператора соответствует PSR-2 — мне также нужно указать на документацию или какую-то ссылку на авторитет:
$error = ($error_status) ? 'Error' : 'No Error';
ИЛИ ЖЕ
$error = $error_status ? 'Error' : 'No Error';
Замечания: php.net он показывает синтаксис с круглыми скобками, но я не смог найти его ни в одном из официальных документов PSR-2.
Если в этом отношении нет стандарта PSR-2, какой способ является наиболее распространенным?
Стандарт ПСР-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 идет так, что
$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';
Если это не указано явно, тогда нет никакого стандарта. Либо работает.