Нашел интересный кусок кода в ядре Symfony
if ('' !== $host = $route->getHost()) {
...
}
Приоритет! == выше, чем =, но как он работает логически? Первая часть понятна, а остальные?
Я создал небольшой образец, но он все еще не ясен: образец
Дело в том, что левая часть присваивания должна быть переменной! Единственный возможный способ добиться этого в вашем примере — это сначала оценить присвоение, что на самом деле делает php.
Добавление скобок проясняет, что происходит
'' !== $host = $route->getHost()
// is equal to
'' !== ($host = $route->getHost())
// the other way wouldn't work
// ('' != $host) = $route->getHost()
Таким образом, условие истинно, если возвращаемое значение $route->getHost()
является непустой строкой, и в каждом случае возвращаемое значение присваивается $host
,
Кроме того, вы можете посмотреть грамматику PHP
...
variable '=' expr |
variable '=' '&' variable |
variable '=' '&' T_NEW class_name_reference | ...
Если вы читаете оператор руководство по приоритетности страница внимательно, вы бы увидели это уведомление
Хотя = имеет более низкий приоритет, чем большинство других операторов, PHP будет
разрешить выражения, подобные приведенным ниже: if (! $ a = foo ()), в
в этом случае возвращаемое значение foo () помещается в $ a.
Других решений пока нет …