回覆列表
  • 1 # 程式設計師小助手

    引言

    我們經常在程式流程中進行邏輯判斷,與或非,用的是爐火純青,相信你也不少用。那麼在PHP中,有兩個運算子非常接近,就是 | 和 ||,那麼他們有什麼區別呢?

    本文就從幾個小栗子,說一說邏輯運算子,和位運算子那些恩愛糾纏。

    學習時間

    正好比PHP內的 & 和 && 的關係一樣,雙符號表示“短路”操作。什麼意思呢,就好比下面這個條件判斷:

    if(condition1 || condition2 || condition3)

    如果 condition1 = true,那麼後面的兩個condition根本不會進行檢查。效率是不是頓時高了起來?

    假如寫成 | ,像下面這樣的判斷邏輯

    if(condition1 | condition2 | condition3)

    這個判斷會把 condition1,2,3 挨個執行一遍,不管 condition1到底是不是true。是不是有點浪費資源了!

    所以說,不使用“短路”運算子,程式上下文是有一定風險的。比如下面的例子,檢查某個物件是否為空,且檢查其某個屬性值滿足某個條件:

    if($class != null && $class->someVar < 20)

    上面的寫法,如果 $class 本身就是 null,那麼直接熔斷;只有 $class 不為空,才會執行接下來的屬性檢查條件。

    如果是一個 & 號,會出現什麼情況呢?

    如果 $class = null,直接丟擲 NullReferenceException 異常;如果 $class != null,第一個條件透過,如果屬性 someVar 不存在,則丟擲method不存在異常;

    所以說,沒有短路機制,這個判斷條件跑偏了。

    深入學習

    其實對於 | 或 &,在PHP中是作為位運算子使用。下圖是PHP位運算子的意義:

    位操作應用於二進位制資料操作,比如:

    A = 01010101 B = 10101010 A | B = 11111111

    當然也可以是任何型別的資料,因為底層還是位元組碼的按位操作。

    寫在最後

    本文透過運算子 | 和 || 的區別與使用,使大家能夠明白,位運算子與邏輯運算子的本質區別。以及邏輯運算子所具有的“短路”機制。

    位操作在資料運算中很高效,但是不直觀。使用的時候要充分測試。

    Happy coding :-)

  • 中秋節和大豐收的關聯?
  • 渭城朝雨浥輕塵下句?