Эти два метода также сделают свою работу:
$zone = $repo->findOneByCode($code) or $zone = new Zone();
($zone = $repo->findOneByCode($code)) || ($zone = new Zone());
Обратите внимание, что or
и &&
имеют разные приоритеты, и поэтому нам нужен () во втором примере.См. http://www.php.net/manual/en/language.operators.logical.php. Пример:
// The result of the expression (false || true) is assigned to $e
// Acts like: ($e = (false || true))
$e = false || true;
// The constant false is assigned to $f and then true is ignored
// Acts like: (($f = false) or true)
$f = false or true;
var_dump($e, $f);
И результат:
bool(true)
bool(false)
Это потому, что and
и or
имеют более низкий приоритет, чем =
означает, что задание будет выполнено первым.С другой стороны, &&
и ||
имеют более высокий приоритет, чем =
, что означает, что сначала будет выполнена логическая операция, а ее результат будет присвоен переменной.Вот почему мы не можем написать:
$result = mysql_query(...) || die(...);
$result
будет содержать результат логической операции (истина или ложь).Но когда мы пишем:
$result = mysql_query(...) or die(...);
присваивание выполняется перед логической операцией.И если это не ложное значение, деталь после or
просто игнорируется.