In PHP, incorrect use of parentheses can cause unexpected behavior in code. Therefore, it is important to avoid the unnecessary usage of
parentheses for language constructs.
Why is this an issue?
Using constructs with parentheses can be misleading as it will produce a syntax that looks like a normal function call. However those constructs
have lower precedence in the evaluation order than some others operators, this can lead to a behavior completely different from what the function
syntax would hint. Also, some of the constructs have optional parameters, while modifying the code we may remove a parameter while keeping the
parentheses, resulting in invalid code.
How to fix it
When not necessary, do not use parentheses for the constructs. To be noted that some construct such as isset()
, exit()
or
array()
does require them. Here is the list of constructs for which parentheses could be used but should be avoided :
return
, echo
, break
, clone
, case
, continue
, include
,
include_once
, require
, require_once
, print
, return
, throw
,
yield
, yield from
Code examples
Noncompliant code example
echo("Hello World");
return(1);
include("file.php");
// Extra examples which show misleadings function syntax
// outputs "string" and "true"
// the expression ("string") && false is first evaluated to false, this is coerced to the empty string "" and printed
// the print construct returns 1 which is truthy, so code in the if block is run
if ( print("string") && false ) {
print "true";
}
// parse error
return();
// parse error: 'echo' construct accepts multiple parameters, but with parentheses this is an invalid syntax
echo("Hello", "World");
// this does not include the file 'vars.php' because 'include' construct has lower precedence than the comparison
// first, ('vars.php') == TRUE is being evaluated and is resolved into '1'
// then, the include construct will be executed with this value
// this is equivalent to: include('1')
if (include('vars.php') == TRUE) {
echo 'OK';
}
Compliant solution
echo "Hello World";
return 1;
include "file.php";
Resources
Documentation