PHP создает новый объект или использует существующий, если isset?
Много раз я нахожу это излишним:
$found = $repo->findOneByCode($code);
$zone = isset($found) ? $found : new Zone();
Может ли кто-нибудь предложить лучший способ, подобный (не работает):
$zone = $repo->findOneByCode($code) || new Zone();
EDIT : я не могу модифицировать Zone и findOneByCode, поскольку они автоматически генерируются классами и функциями по Доктрине ORM.
4 ответа:
Если вы используете >= PHP 5.3
$zone = $repo->findOneByCode($code) ?: new Zone();В противном случае может быть, это лучше? (все еще немного уродливо)...
if ( ! ($zone = $repo->findOneByCode($code))) { $zone = new Zone(); }Предполагая неудачу,
$repo->findOneByCode()возвращает ложное значение...
То, что вы описываете, - это ленивый синглетный паттерн. Это когда существует только один экземпляр класса, но он не инициализируется, пока вы не попытаетесь его использовать.
Пример: http://blog.millermedeiros.com/2010/02/php-5-3-lazy-singleton-class/
Вы можете сделать следующее:
Заметьте, однако, что это не работает точно, как использование$zone = ($z = $repo->findOneByCode($code)) ? $z : new Zone();isset(). В то время как использованиеisset()позволит другим значениям falsey, отличным отNULL, пройти через (например,FALSE), Использованиеa ? b : cразрешитcна всех ложных значениях .
Эти два метода также сделают свою работу:
Обратите внимание, что$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будет содержать результат логической операции (true или false). Но когда мы пишем:$result = mysql_query(...) or die(...);Задание выполняется перед логической операцией. И если это не ложное значение, то часть после
orполностью игнорируется.