2014-04-24 63 views
0

有人可以解釋這是如何工作的?非常感謝:)PHP函數標誌作爲參數

define("FLAG_A", 1); 
    define("FLAG_B", 2); 
    define("FLAG_C", 4); 
    function test_flags($flags=false) { 
     if ($flags & FLAG_A) echo "A"; 
     if ($flags & FLAG_B) echo "B"; 
     if ($flags & FLAG_C) echo "C"; 
    } 
    test_flags(FLAG_A|FLAG_B); 
+1

我認爲你應該做一些研究自己進入位運算符是什麼以及如何他們每個人的工作。 –

+1

哦,非常感謝,真的我沒有線索什麼谷歌:) – Adrian

+0

你知道什麼,我看了以後,它幾乎立即有感:))謝謝! – Adrian

回答

3

這是使用所謂bitwise math完成。具體而言,他們正在使用&(按位和)操作來檢查是否設置了值。爲了這裏的論點,我們將使用4位數字,以保持簡短。

數7,在4位二進制,如下:

0111 

每個數字具有被每次加倍的值,並且所有這些加在一起,以使7總數。看,它的工作原理是這樣:

0 1 1 1 
^ ^^^
| | | | 
8 4 2 1 

所以,從本質上講,它是:現在

0 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 7 

,有位明智的數學,特別是按位,而且,我們可以說我們只關心某些列中的位 - 基本上,每列中的位必須是1,否則它將被設置爲零。因此,按位數學檢查「4」內部「7」:

0111 (7) 
& 0100 (4) 
______ 
    0100 (4) 

由於該值不爲零,這是事實,我們可以確定值4是值7的內部現在考慮11號:

1 0 1 1 
^ ^^^
| | | | 
8 4 2 1 

1 * 8 + 0 * 4 + 1 * 2 + 1 * 1 = 11 

嘗試在

1011 (11) 
& 0100 (4) 
______ 
    0000 (0) 

尋找4由於它的值爲0,這是假的,我們可以認爲數(4)不是裏面的編號爲11.

類似地,我們可以得出結論,數字4,2和1,但不爲,在7 11,我們通過處理數字作爲一系列位,而不是一個單一的8,圖2和1。值,我們可以在一個整數內存儲多個標誌。它

肯定做按位數學一些更多的閱讀,正確使用,只是不嘗試它可以是非常有用的鞋拔到的一切。

+0

尊重詳細的回覆!非常感謝!我真的不知道它是背後的二進制數學,哎呀,我甚至沒有注意到一個「&」。我熟悉二進制數學,但你很快就能做出快速進修!謝啦! – Adrian

1

這是基於位運算符。想到

define("FLAG_A", 0001); // in binary form 
define("FLAG_B", 0010); 
define("FLAG_C", 0100); 

因此,例如,$flags & FLAG_A是按位與可變$flags和恆定FLAG_A之間。

+0

幫了一下:) – Adrian