2011-08-08 87 views
6

我正在經歷php.net的運算符優先級部分和整個this example它說:運算符優先級和短路

$a = 1; 
$b = null; 
$c = isset($a) && isset($b); 
$d = (isset($a) and isset($b)); 
$e = isset($a) and isset($b); 
var_dump($a, $b, $c, $d, $e); 
//Result: 
int(1) 
NULL 
bool(false) 
bool(false) <== I get this 
bool(true) <== I do not get this 

我用了相當多的調試,來到在我的代碼中詳細打印(_r)語句以跟蹤我在代碼中的位置。所以我使用$debug and print_r($dataArray)$verbose and print "Updating dataArray\n"作爲代碼之間的單獨聲明,從而允許我控制這些print(_r)語句。這來自我的BASH經驗,我曾經寫過很多[[ $condition ]] && { #Do if true } || { #Do if false }。在BASH,我知道他們是短路的,並用這個事實來寫很多簡單的襯裏。
現在我正在觀察,很多這種做法(編寫$verbose and print)正在慢慢蔓延到我的if聲明中。我知道這是不是一個建議的做法,可以咬我。然而,我很想掌握這個技巧,因爲我喜歡寫這樣的襯衫,並且想用它作爲我的個人風格​​

所以我的問題(s)爲(是):

  1. 哪個運營商(&&and)是短路?
  2. 該手冊說&&優先於and,但有人可以通過將短路操作員功能/功能/特性與操作員優先級混合來舉例說明。 (基本上是優先和短路的混合匹配)

請仔細闡述運營商的短路以及返回性質。

PS:1.我希望這些操作符的關聯性相同且直觀,但如果您知道任何怪癖,請賜教。
PS:2.如果您仍然想警告我,避免這種做法的危險,請舉例說明。

編輯:用||更換or改變我的簡單$var = mysql_(...) or die()代碼後,我發現是多麼討厭使用||&&運營商,而不是andor該代碼根本不起作用!就我的理解,前一個構造將TRUEFALSE的返回值分配給$var,這反過來使$var的所有順序使用都生成警告/錯誤/意外行爲。後者構建體首先將mysql_(...)的結果分配給$var,然後評估=die的化合物。
對我來說這是一個很好的教訓,我更好1.開始使用PDO/mysqli並自己處理錯誤2.在寫上面我稱之爲個人風格​​之前請三思。
//提醒自己:不要用一個腳本/解釋語言,而寫在另一個代碼,每一個都是獨特的,都有自己的怪癖和陷阱,以及那只是傷心*嘆*

+0

可能重複[參考 - 這個符號在PHP中意味着什麼?](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – Gordon

+0

@Gordon :感謝您的參考_。我檢查了列表,儘管幾個問題似乎回答了部分問題(如我已經知道的優先級)。恕我直言,運營商的短路性質以及它們的優先權沒有詳細討論。 – Sudhi

+0

對示例鏈接評論的作者提到了運算符優先級,它指示AND關鍵字在equals之後被評估。它看起來很奇怪,但它讓我想起了一些腳本使用的一些'mysql_connect(...)或die()'行。 –

回答

7

代碼的經驗

$e = isset($a) and isset($b); 

被解析相同

($e = isset($a)) and isset($b); 

因此$e,如通過isset($a)和分配確定的,是true - 獨立evaluati的ng isset($b)

+1

所以要清楚:這與短路無關。 –

+0

@Felix:你可以在PHP中寫/解釋/詳細說明短路嗎?我特別關注短路後產生的返回值。 – Sudhi

+1

@Sudhi:我不明白你想要我寫什麼。所有這些運算符('&&','||','和','或')都是短路的......返回值總是一個布爾值。 –