7

Found an interesting piece of code in Symfony core

if ('' !== $host = $route->getHost()) {
    ...
}

The precedence of !== is higher than the = but how does it work logically? The first part is clear but the rest?

I've created a little sample but it's still not clear: sample

5
  • 5
    Do it the save way if ('' !== ($host = $route->getHost())) { Commented Mar 6, 2017 at 15:12
  • 1
    avoid problem using parenthesis .. Commented Mar 6, 2017 at 15:13
  • 1
    Possible duplicate of JS vs PHP: assignment operator precedence when used with logical-or Commented Mar 6, 2017 at 15:16
  • 1
    Look at this sandbox.onlinephpfunctions.com/code/… maybe you get wired more or get it fully ;-) But for humanreadable and savety do it in the save way. By thw way this $host = $route->getHost() can be done a line before :-) Commented Mar 6, 2017 at 15:17
  • 1
    I just don't get how can the $host = $route->getHost() part be executed first as the precedence is lower? Commented Mar 6, 2017 at 15:25

1 Answer 1

3

The point is: The left hand side of an assignment has to be an variable! The only possible way to achieve this in your example is to evaluate the assignment first - which is what php actually does.

Adding parenthesis makes clear, what happens

'' !== $host = $route->getHost()
// is equal to
'' !== ($host = $route->getHost())
// the other way wouldn't work
// ('' != $host) = $route->getHost()

So the condition is true, if the return value of $route->getHost() is an non empty string and in each case, the return value is assigned to $host.

In addition, you could have a look a the grammer of PHP

...
variable '=' expr |
variable '=' '&' variable |
variable '=' '&' T_NEW class_name_reference | ...

If you read the operator precendence manual page carefully, you would see this notice

Although = 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.

Sign up to request clarification or add additional context in comments.

2 Comments

same reason wordpress coding standards use yoda conditions
Thank you - that was my guess but could not find it in the docs

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.