Reputation: 5074
I'm a bit confused about operator precedence actually.
Here is an example that doesn't match with the php official website
function getValue($key) {
$array = ['un' => 1, 'six' => 6];
if (array_key_exists($key, $array)) {
return $array[$key];
}
return null;
}
var_dump(null === $t1=getValue('un'));
var_dump(null === $t2=getValue('blablablaaaaaa'));
// And now I switch
var_dump($t3=getValue('un') === null);
var_dump($t4=getValue('blablablaaaaaa') === null);
OUTPUT
bool(false)
bool(true)
// After the switch
bool(false)
bool(true)
This is not what I was expecting for the two first outputs, because the comparison is higher-precedence than assignment. So php should've tried to compare null === $t1
, or $t1
has not been declared yet, so a warning or error or whatever should've been raised. Or that didn't happen. Do you notice that PHP sometimes treat assignment before comparison although comparison is higher-precedence and thus should always be performed before assignment?. Any explanations about this?
My second question is: should this be avoided by always splitting up this kind of expression?
UPDATE
N.B
var_dump($t1, $t2, $t3, $t4);
// OUTPUT
int(1)
NULL
// After the switch
bool(false)
bool(true)
Upvotes: 3
Views: 291
Reputation: 31749
===
is non-associative.
Non-associative operators are operators that have no defined behavior when used in sequence in an expression.
And in docs
=
has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.
So it can be assumed PHP
(in any of the expression) will first assign the return value of the function to the variable and then compare.
Upvotes: 2