PHP 的比較運算與邏輯運算詳解

NO IMAGE

1、以下值用 empty() 被判斷為true:

未賦值變數、未宣告變數、0、”0″、””、false、null、空陣列 array() 、物件的魔術方法 __get() 返回的值

在低於 PHP5.0 的版本中,沒有任何屬性的物件也被 empty 判斷為 true

注意:empty() 只接受變數或變數的索引值或屬性值,不能直接傳入常量,也不能傳入運算表示式,PHP 5.5 之後支援表示式

2、被 isset() 判斷為 false 的值:未賦值變數、未宣告變數、null、__get() 返回的值,接受的參與 empty()一樣,不能是常量和表示式.

3、不同型別的資料比較

如果有一個是 boolean 型或者 null, 轉換成 boolean 比較,

否則如果有一個是 number,轉換成 number 比較,

否則如果有一個是 string,轉換成 string 比較

object 型別總是大於 array  型別和標量型別,array 型別總是大於 標量型別

注意這些比較結果:


//0開頭的數字字串轉數字時不會按八進位制轉換,而是簡單地丟棄把 '0' 丟棄按數字進行比較,
123=='0123' //true
"123"<"0124" //true,0開頭的數字字串直接按十進位制數字比較而非八進位制
"012" == 10 // false
== 10 // true
0x12 == 18 // true
"0x12" == 18 // true
false < true; //true
2>true; // false
2==true; // true 
null==0; //true
-1<0;//true
-1<null;//false ,-1 轉 bool 是true

4、型別轉換規則

被 empty() 判斷為 true 的值轉換為 boolean 型得到 false ,反之,得到 true  ( __get() 返回的值需按具體的值判斷)

被 empty() 判斷為 true 的值轉換成 number 得 0,非空的 array 轉 number 得到1  ( __get() 返回的值需按具體的值判斷)


class Test{
private $k=1;
public function __get($propertyName){
return 123;
}
}
$obj = new Test();
echo json_encode(empty($obj->k)); //true
echo json_encode(isset($obj->k)); //false
echo json_encode((bool)($obj->k)); //true

幾個string 轉 number 的場景: 


echo 'abc'*1 ; //0 
echo '012'*1; //12 乘法:可以轉換十六進位制數,不是數字開頭則返回 0
echo '0x12.123'*1; //18
echo (float)'0x12' ;//0 
echo (int)'0x12' ; //0 不能處理十六進位制數
echo (float)'12abc'; //12 擷取左側字串
echo (float)'abc'; // 0 不是數字返回0
is_numeric('0x123'); //true 能識別十六進位制數
is_numeric('0x123.123'); //false 識別目標是整個字串而非擷取前面一部分

string 轉 number 時擷取左側的數字字串進行轉換,如果沒有則返回 0.

其他資料轉字串:


//幾個轉字串的值(string)0 ; // "0"
(string)true; // "1"
(string)false; // ""
(string)null; // ""
(string)array(); // "Array"

陣列可以直接進行字串拼接操作但不能進行數學運算.

object 型別轉換成 boolean 總是 true, object 型別不能轉換成 number 和 string ,因此也不能進行字串拼接和數學運算

標量轉換成 array 的方式是將陣列第一個元素設定成標量,返回該陣列。

標量轉換成 object 得到一個 stdClass 類的例項,標量的值被賦給名為 scalar 的屬性: Object(    [scalar] => 234)

array 轉 object 得到一個 stdClass 類的例項,陣列的 key 為實力的屬性名。

object 轉 array 有點複雜:

方法、靜態屬性、類常量被丟棄

保護屬性名稱前面被被加上一個 “*”

私有屬性前面被加上類名作為字首(大小寫與類名完全相同)

這些字首的前後都加上空字元 \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 B
AA,length: 2 value: public property, $AA of class B
*B,length: 4 value: protected property, $B of class B
AA,length: 4 value: private property, $A of class A
*C,length: 4 value: protected property, $C of class A

 5、 邏輯運算總是返回 true 或 false (寫多了 javascript 的人要注意),邏輯運算子優先順序從高到低 為 &&、 ||、 and、 or ,邏輯運算子的短路效果可以使用語句中,但記住他們不會像 javascript 中那樣返回一個 不是 boolean 型別的值,在表示式中使用要注意。

 


$a = 1;
$b=0;
$b and $a = 100;
echo $a; //1
$b || $a = 200;
echo $a; //200

6、switch 的比較不是 “===” 而是 “==” (在 javascript 中是 “===”)

7、 在 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]); //false
empty($str[0.5]); //false 索引被向下取整 為 0
empty($str["0.5"]); //false 索引被向下取整 為 0,PHP5.4之後不取證,判定為 true 
empty($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
}

8、三元運算子: 跟其他大多數程式語言不一樣,PHP 的三元運算子是左結合的!


$arg = 'T'; 
$vehicle = ( ( $arg == 'B' ) ? 'bus' : 
( $arg == 'A' ) ? 'airplane' : 
( $arg == 'T' ) ? 'train' : 
( $arg == 'C' ) ? 'car' : 
( $arg == 'H' ) ? 'horse' : 
'feet' ); 
echo $vehicle; //horse

三元運算表示式被劃分為


( $arg == 'B' ) ? 'bus' : ( $arg == 'A' ) 
? 'airplane' : ( $arg == 'T' ) 
? 'train' : ( $arg == 'C' )
? 'car' : ( $arg == 'H' )
? 'horse' : 'feet' ;

以上這篇PHP 的比較運算與邏輯運算詳解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援指令碼之家。

您可能感興趣的文章:

PHP 的比較運算與邏輯運算詳解PHP比較運算子的詳細介紹php中的比較運算子詳解PHP字串 ==比較運算子的副作用