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

[source,php,diff-id=1,diff-type=noncompliant]
----
echo("Hello World");
return(1);
include("file.php");
----

[source,php,diff-id=2,diff-type=noncompliant]
----
// 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

[source,php,diff-id=1,diff-type=compliant]
----
echo "Hello World";
return 1;
include "file.php";
----

== Resources
=== Documentation

* https://www.php.net/manual/en/reserved.keywords.php[PHP List of Keywords]
