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.