smarber
smarber

Reputation: 5074

Variable assignment into if statement for example

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

Answers (1)

Sougata Bose
Sougata Bose

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

Related Questions