2013-04-05 6 views
2

Нашел несколько интересных фрагментов кода сегодня. Упрощенно это выглядит следующим образом:Приоритет операторов «или» и присвоение

$var = null; 

$var or $var = '123'; 

$var or $var = '312'; 

var_dump($var); 

Дело в том, что, как я знаю, precedence of assignment is higher that OR, так как я предполагаю, var_dump должен вывести 312 (первый - назначение, второй - сравнить логически). Но результат дефферентен, я получаю 123 (сначала - проверьте, $var конвертирует в true, второй - если нет, назначьте значение).

Вопросы, как это работает?

Почему такое же поведение для or и ||?

ответ

3

Вы можете увидеть примеры о подобном поведении в Logical Operators

Также вы можете прочитать artical о Short-circuit evaluation

короткого замыкания, выражение x Sand y (используя песок обозначают сорт короткого замыкания) эквивалентно условному выражению if x then y else false; выражение x Sor y является equiv alent до if x then true else y.

В php.

return x() and y(); 

равна

if (x()) 
    return (bool)y(); 
else 
    return false; 

return x() or y(); 

равна

if (x()) 
    return true; 
else 
    return (bool)y(); 

Таким образом, дело не только в приоритете.

+1

Это имеет смысл! Спасибо! Итак, причина в том, что «операторы короткого замыкания - это, по сути, управляющие структуры, а не простые арифметические операторы» – Timur

3

Это же, как

$var = null; 

if(!$var)$var = '123'; 
if(!$var)$var = '321'; 

var_dump($var); 
+0

Я знаю, что это то же самое. Я хочу знать, как это работает. – Timur

+0

Выполняет строку после 'или' (в вашем случае '$ var = '123';'), только если оператор перед 'или' является 'empty/false/null/etc ...' – Narek

Смежные вопросы