1. 邏輯運算總是返回 true 或 false (寫多了 javascript 的人要注意),邏輯運算子優先順序從高到低 為 &&、 ||、 and、 or ,邏輯運算子的短路效果可以使用語句中,但記住他們不會像 javascript 中那樣返回一個 不是 boolean 類型的值,在運算式中使用要注意。
$a = 1;$b=0;$b and $a = 100;echo $a; //1$b || $a = 200;echo $a; //200
2. switch 的比較不是 "===" 而是 "==" (在 javascript 中是 "===")
3. 未賦值變數、未聲明變數、0、"0"、""、false、null、空數組 array() 、對象的魔術方法 get() 返回的值
在低於 PHP5.0 的版本中,沒有任何屬性的對象也被 empty 判斷為 true
注意:empty() 只接受變數或變數的索引值或屬性值,不能直接傳入常量,也不能傳入運算運算式,PHP 5.5 之後支援運算式
4. 被 isset() 判斷為 false 的值:未賦值變數、未聲明變數、null、get() 返回的值,接受的參與 empty()一樣,不能是常量和運算式.
5. 在 php4 中,object 之間的比較方式與 array 相同,在 php5 中 , object 類型間的 "==" 比較為 true的前 提是,他們屬於同一個類的執行個體(當然還要進行屬性的比較,這類似標量的"==="比較),object 間的 "===" 比較為 true 的前提是他 們 就是同一個對象。
在 PHP4 中 ,不包括任何成員變數的對象 被 empty() 判斷為 true
字串位移 offset 取字元的 empty() 判定: 取對應 offset 的字元進行判斷,在PHP5.4 以前,使用索引從字串中取字元時會先將索引進行取整,因此左側不包含數位字串都被轉換成0,PHP5.4之後,不再對非整形格式的字串索引進行取整,因此判斷為 true, 同理,isset() 判定為false. 如:
$str = 'ab0d';empty($str[0]); //falseempty($str[0.5]); //false 索引被向下取整 為 0empty($str["0.5"]); //false 索引被向下取整 為 0,PHP5.4之後不取證,判定為 trueempty($str[2]); //true ,取得的字元為 "0"empty($str["3"]); //false ,取得的字元為 "d"empty($str[4]); //true ,索引超出範圍,notice 警告,但 empty() 會忽略警告empty($str['a']); // false ,左側不包含數字字串索引 PHP5.4之前被處理為 $str[0],PHP5.4之後,直接為判定 true
無論是“不等於”還是”==“ ,不要在 PHP 的跨類型資料比較中使用”傳遞性“:
$a == $b; //true
$b == $c; //true
並不能說明 $a == $c 為 true
數組的比較方法
// 數組是用標準比較子這樣比較的function standard_array_compare($op1, $op2){ if (count($op1) < count($op2)) { return -1; // $op1 < $op2 } elseif (count($op1) > count($op2)) { return 1; // $op1 > $op2 } foreach ($op1 as $key => $val) { if (!array_key_exists($key, $op2)) { return null; // uncomparable } elseif ($val < $op2[$key]) { return -1; } elseif ($val > $op2[$key]) { return 1; } } return 0; // $op1 == $op2}
6. 不同類型的資料比較
如果有一個是 boolean 型或者 null, 轉換成 boolean 比較,
否則如果有一個是 number,轉換成 number 比較,
否則如果有一個是 string,轉換成 string 比較
object 類型總是大於 array 類型和標量類型,array 類型總是大於 標量類型
7. 類型轉換規則
被 empty() 判斷為 true 的值轉換為 boolean 型得到 false ,反之,得到 true ( get() 返回的值需按具體的值判斷)
被 empty() 判斷為 true 的值轉換成 number 得 0,非空的 array 轉 number 得到1 ( get() 返回的值需按具體的值判斷)
6. 數組可以直接進行字串拼接操作但不能進行數學運算
object 類型轉換成 boolean 總是 true, object 類型不能轉換成 number 和 string ,因此也不能進行字串拼接和數學運算
標量轉換成 array 的方式是將數組第一個元素設定成標量,返回該數組。
標量轉換成 object 得到一個 stdClass 類的執行個體,標量的值被賦給名為 scalar 的屬性: Object( [scalar] => 234)
array 轉 object 得到一個 stdClass 類的執行個體,數組的 key 為實力的屬性名稱。
object 轉 array 有點複雜:
方法、靜態屬性、類常量被丟棄
保護屬性名稱前面被被加上一個 "*"
私人屬性前面被加上類名作為首碼(大小寫與類名完全相同)
這些首碼的前後都加上Null 字元 \0
例如一個由 object 轉換來的 array 為:
Array( [*v] => 444 [bf] => 333 [bk] => 99977 [Ak] => 999 [*p] => 888 [a2] => 22)
原對象中有:
public 屬性 a2, protected 屬性 v、p ,這些屬性來自哪個類無法鑒別(被重寫則取子類的屬性)
來自類 b 的 private 屬性 f、k,(從數組 key 來看,以bf為例,無法判斷他是屬性名稱為bf,還是來自類b的私人屬性f)
來自類 A 的 private 屬性 k
無法鑒別 b 和 A 哪個是子類哪個是父類(僅從 array 的key來看,也無法推斷出原物件建構自哪個類)
class A { private $A = 'private property, $A of class A'; // This will become '\0A\0A' protected $C = 'protected property, $C of class A';} class B extends A { private $A = 'private property, $A of class B'; // This will become '\0B\0A' public $AA = 'public property, $AA of class B'; // This will become 'AA' protected $B = 'protected property, $B of class B';} $arr = (array) new B(); foreach ($arr as $key => $value) { echo '<br />'; echo $key .',length: '.strlen($key).' value: '.$value;}
輸出結果:
BA,length: 4 value: private property, $A of class BAA,length: 2 value: public property, $AA of class B*B,length: 4 value: protected property, $B of class BAA,length: 4 value: private property, $A of class A*C,length: 4 value: protected property, $C of class A