這兩種方法也將做的工作:
$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
之後的部分完全被忽略。
http://en.wikipedia.org/wiki/Singleton_pattern –
將'findOneByCode()'方法擴展爲返回所需空對象而不是'null'的方法。 – mario