4

很多时候我发现这是多余的:

$found = $repo->findOneByCode($code);
$zone = isset($found) ? $found : new Zone();

任何人都可以提出更好的方法,类似于(不工作):

$zone = $repo->findOneByCode($code) || new Zone();

编辑:我无法修改ZonefindOneByCode因为它们是由 Doctrine ORM 自动生成的类和功能。

4

4 回答 4

4

如果您使用 >= PHP 5.3

$zone = $repo->findOneByCode($code) ?: new Zone();

否则也许这会更好?(还是有点丑)...

if ( ! ($zone = $repo->findOneByCode($code))) {
    $zone = new Zone();
}

假设失败,$repo->findOneByCode()返回一个虚假值......

于 2011-09-30T21:42:54.697 回答
0

您所描述的是一种惰性单例模式。这种情况下,只有一个类的实例,但在您尝试使用它之前它不会被初始化。

示例:http ://blog.millermedeiros.com/2010/02/php-5-3-lazy-singleton-class/

于 2011-09-30T21:50:09.120 回答
0

您可以执行以下操作:

$zone = ($z = $repo->findOneByCode($code)) ? $z : new Zone();

但是请注意,这使用isset(). 虽然 usingisset()将允许其他错误值NULL通过(例如FALSE),但 usinga ? b : c将解析为c 所有错误值

于 2011-09-30T21:51:54.473 回答
0

这两种方法也可以完成这项工作:

$zone = $repo->findOneByCode($code) or $zone = new Zone();

($zone = $repo->findOneByCode($code)) || ($zone = new Zone());

注意orand&&有不同的优先级,这就是我们在第二个例子中需要 () 的原因。请参阅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)

这是因为andor的优先级低于=意味着将首先完成分配。另一方面,&&优先||级高于=意味着逻辑运算将首先完成,并将其结果分配给变量。这就是为什么我们不能写:

$result = mysql_query(...) || die(...);

$result将保存逻辑运算的结果(真或假)。但是当我们写:

$result = mysql_query(...) or die(...);

赋值是在逻辑运算之前完成的。如果它不是错误的值,则后面的部分将or被完全忽略。

于 2011-09-30T22:43:27.293 回答