В PHP оператор присваивания =
имеет более низкий приоритет, чем большинство других операторов. (Для получения дополнительной информации см. documentation). Кроме того, результатом выражения с использованием оператора присваивания является значение присваивания. Имея это в виду, рассмотрим выражения вы разместил:
Первый пример:
($test = array('key'=>true)) && $test['key']
Первая часть этого выражения, ($test = array('key'=>true))
вычисляет array('key'=>true)
(по указанному выше правилу), а вторая часть имеет значение true
с ключом был просто установлен. Таким образом, все выражение оценивается как true
.
Второй пример:
$test = array('key'=>true) && $test['key']
По правилам приоритета операторов, $test
собирается получить присваивается значение выражения array('key'=>true) && $test['key']
.Первая половина этого вопроса верна, но $test['key']
еще не установлен, поэтому true && false
является ложным, поэтому $test
принимает значение false
, что также является результатом условия if.
Существует причина, по которой многие * современные * языки запрещают эту конструкцию и/или имеют соответствующую статическую типизацию для смягчения там, где она может укусить. В C, который использовался для записи, как Yoda, для улавливания ошибок: 'if (1 = x) {' - более современные компиляторы предупреждают, если нет внешнего '()', чтобы показать в намерении это назначение (это не означает, t изменить допустимую грамматику). С * возможным * исключением * idiomatic * while-readline (которое на самом деле в основном нарушено в PHP), я не вижу причин использовать этот синтаксис, подверженный ошибкам. Использование нескольких утверждений сделает намерение более ясным и покажет, «это то, что я хотел сделать». –