透過範例學習php的比較運算與邏輯運算

WBOY
發布: 2016-07-25 09:07:46
原創
1078 人瀏覽過
  1. class Test{

  2. private $k=1;
  3. public function __get($propertyName){$propertyName){$propertyName
  4. return 123;
  5. }
  6. }
  7. $obj = new Test();

  8. echo json_encode(empty($obj->k)); // true
  9. echo json_encode(isset($obj->k)); //false
  10. echo json_encode((bool)($obj->k)); //true
  11. ?>
複製程式碼

string 轉number 時截取左邊的數字字串進行轉換,如果沒有則回傳0,

  1. //幾個轉字串的值

  2. ( string)0 ; // "0"

  3. (string)true; // "1"
  4. (string)false; // ""
  5. (string)null; // ""
  6. ( string)array(); // "Array"
  7. ?>
複製程式碼

陣列可以直接進行字串拼接操作但不能進行數學運算. object 類型轉換成 boolean 總是 true, object 類型不能轉換成 number 和 string ,因此也不能進行字串拼接和數學運算 標量轉換成 array 的方式是將陣列第一個元素設定成標量,傳回該陣列。 標量轉換成 object 得到一個 stdClass 類別的實例,標量的值被賦給名為 scalar 的屬性: Object( [scalar] => 234) array 轉 object 得到一個 stdClass 類別的實例,而陣列的 key 就是實力的屬性名稱。 object 轉 array 有點複雜: 方法、靜態屬性、類別常數被丟棄 保護屬性名稱前面被加上一個 "*" 私有屬性前面被加上類別名稱(大小寫與類別名稱完全相同)

例如一個由 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來看,也無法推斷出原始物件建構自哪個類別)

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

  1. $a = 1;
  2. $b=0;
  3. $b and $a = 100;
  4. $b=0;
  5. $b and $a = 100;
  6. echo $a; //1
  7. $b || $a = 200;
eacho $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. 如:
  1. $str = 'ab0d';
  2. empty($str[0]); //false
  3. empty ($str[0.5]); //false 索引被向下取整為0
  4. empty($str["0.5"]); //false 索引向下取整為0,PHP5.4之後不取證,判定為true
  5. empty($str[2]); //true ,取得的字元為"0"
  6. empty($str["3"]); //false ,取得的字元為"d"
  7. empty($str[4]); //true ,索引超出範圍,notice 警告,但empty() 會忽略警告
  8. empty($str['a']); // false ,左側不包含數字字串索引PHP5.4之前被處理為$str[0],PHP5.4之後,直接為判定true
?>
複製程式碼

無論是「不等於」或」==「 ,不要在 PHP 的跨型別資料比較中使用」傳遞性「: $a == $b; //true $b == $c; //true 並不能說明 $a == $c 為 true

陣列的比較方法

  1. // 數組是用標準比較運算符這樣比較的
  2. function standard_array_compare($op1, $op2)
  3. {
  4. if (count($op1) return -1; // $op1 } elseif (count($op1) > count($op2 )) {
  5. return 1; // $op1 > $op2
  6. }
  7. foreach ($op1 as $key => $val) {
  8. if (!array_key_exists($key, $op2) ) {
  9. return null; // uncomparable
  10. } elseif ($val return -1;
  11. } elseif ($val > $op2[$key] ) {
  12. return 1;
  13. }
  14. }
  15. return 0; // $op1 == $op2
  16. }
  17. ?>
複製程式碼

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

  1. $arg = 'T';
  2. $vehicle = ( ( $arg == 'B' ) ? 'bus ' :
  3. ( $arg == 'A' ) ? 'airplane' :
  4. ( $arg == 'T' ) ? 'train' :
  5. ( $arg == 'C' ) ? ' car' :
  6. ( $arg == 'H' ) ? 'horse' :
  7. 'feet' );
  8. echo $vehicle; //horse
  9. ?>
複製程式碼

三元運算表達式被分割為 ( $arg == 'B' ) ? 'bus' : ( $arg == 'A' ) ? 'airplane' : ( $arg == 'T' ) ? 'train' : ( $arg == 'C' ) ? 'car' : ( $arg == 'H' ) ? 'horse' : 'feet' ;



來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板