Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are parentheses required in PSR-2 PHP ternary syntax?

Tags:

php

psr-2

psr-1

Question: are parentheses required in PSR-2 PHP ternary syntax?

Looking for which (if either) of the following ternary statement's syntax is compliant with PSR-2 - I also need to be pointed to documentation or some authority link:

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

OR

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


Note: php.net it shows the syntax with the parentheses, but I could not find this in any of the 'official PSR-2' docs.


Conclusion

If there is no PSR-2 standard on this, which way is the most common convention?

like image 594
Wallter Avatar asked Oct 15 '14 18:10

Wallter


People also ask

How ternary operator is used in PHP?

ternary operator: The ternary operator (?:) is a conditional operator used to perform a simple comparison or check on a condition having simple statements. It decreases the length of the code performing conditional operations. The order of operation of this operator is from left to right.

Is ternary operator faster than if in PHP?

The right answer is: it depends. Most of the time, they are about the same speed and you don't need to care. But if $context['test'] contains a large amount of data, snippet 2 is much faster than snippet 1.

Can we use nested ternary operator in PHP?

In PHP 7.4 using nested ternaries without explicit parentheses will throw a deprecation warning. In PHP 8.0 it will become a compile-time error instead.


2 Answers

The PSR-2 standard specifically omits any opinion on operators:

There are many elements of style and practice intentionally omitted by this guide. These include but are not limited to: ... Operators and assignment

Since parentheses are used to group expressions, your example doesn't make much sense:

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

Here there is no meaning to surrounding a single variable in parentheses. A more complex condition might benefit from parentheses, but in most cases they would be for readability only.

A more common pattern would be to always surround the entire ternary expression:

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

The main motivation for this is that the ternary operator in PHP has rather awkward associativity and precedence, so that using it in complex expressions often gives unexpected / unhelpful results.

A common case is string concatenation, e.g.:

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

Here the concatenation (. operator) is actually evaluated before the ternary operator, so the condition is always a non-empty string (beginning 'Status: '), and you will always get the string Error' as the result.

Parentheses are necessary to prevent this:

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

A similar situation exists when "stacking" ternary expressions to form the equivalent of an if-elseif chain, as a mistake early in PHP's history means multiple ternary operators are evaluated in sequence left to right, rather than shortcutting the entire false branch when a condition is true.

An example from the PHP manual explains this more clearly:

// 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.
like image 87
IMSoP Avatar answered Oct 19 '22 14:10

IMSoP


Common convention is always simplify. PSR standard goes a way that

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

Seems more cleaner than parentheses.

If you want explicit more readability, the PSR-2 standard goes to:

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

It's all. PSR it's a standard to better understand our code, when you write a code like you are providing, you're going deeper on simplification, and there's no limitation to your imagination, just avoid not exceed PSR rules.

Use PHP Code Sniffer to check-out your code on PSR1 and PSR2 rules.

Code Sniffer

like image 2
Mauricio Piber Fão Avatar answered Oct 19 '22 16:10

Mauricio Piber Fão