2013-03-05 70 views
0

我發現這一串代碼Services_JSON PHP庫:「和」運營商在條件語句

if ($this->use & SERVICES_JSON_LOOSE_TYPE) { 
    $stk = array(SERVICES_JSON_IN_OBJ); 
    $obj = array(); 
} else { 
    $stk = array(SERVICES_JSON_IN_OBJ); 
    $obj = new stdClass(); 
} 

我的問題是關於第一線。運營商做什麼單「&」

+1

RTM - http://php.net/manual/en/language.operators.bitwise.php – j08691 2013-03-05 15:50:05

+0

它是一個按位運算符,不是邏輯運算符。它以二進制級別操作數據,這爲您提供了很多功能,但請不要將它與邏輯AND運算符'&&'混淆。 – Andrew 2013-03-05 15:52:18

回答

0

只是爲了說明不僅什麼&做但什麼該位與運營商在這種情況下,可能用於看一看

<?php 
define('SOME_FLAG', 1); 
define('SERVICES_JSON_LOOSE_TYPE', 2); 
define('ANOTHER_FLAG', 4); 

foo(0); 
foo(7); 
foo(SERVICES_JSON_LOOSE_TYPE|ANOTHER_FLAG); 

function foo($value) { 
    echo "foo($value)\n"; 

    bar($value, SOME_FLAG); 
    bar($value, SERVICES_JSON_LOOSE_TYPE); 
    bar($value, ANOTHER_FLAG); 

    if ($value & SOME_FLAG) { 
     echo " SOME_FLAG set\n"; 
    } 
    else { 
     echo " SOME_FLAG NOT set\n"; 
    } 

    if ($value & SERVICES_JSON_LOOSE_TYPE) { 
     echo " SERVICES_JSON_LOOSE_TYPE set\n"; 
    } 
    else { 
     echo " SERVICES_JSON_LOOSE_TYPE NOT set\n"; 
    } 

    if ($value & ANOTHER_FLAG) { 
     echo " ANOTHER_FLAG set\n"; 
    } 
    else { 
     echo " ANOTHER_FLAG NOT set\n"; 
    } 
    echo "\n"; 
} 

function bar($value, $flag) { 
    printf(" value| %08s (%d)\n", decbin($value), $value); 
    printf(" flag |& %08s (%d)\n", decbin($flag), $flag); 
    printf(" and |= %08s (%d)\n", decbin($value & $flag), $value & $flag); 
    echo "\n"; 
} 

輸出

foo(0) 
    value| 00000000 (0) 
    flag |& 00000001 (1) 
    and |= 00000000 (0) 

    value| 00000000 (0) 
    flag |& 00000010 (2) 
    and |= 00000000 (0) 

    value| 00000000 (0) 
    flag |& 00000100 (4) 
    and |= 00000000 (0) 

    SOME_FLAG NOT set 
    SERVICES_JSON_LOOSE_TYPE NOT set 
    ANOTHER_FLAG NOT set 

foo(7) 
    value| 00000111 (7) 
    flag |& 00000001 (1) 
    and |= 00000001 (1) 

    value| 00000111 (7) 
    flag |& 00000010 (2) 
    and |= 00000010 (2) 

    value| 00000111 (7) 
    flag |& 00000100 (4) 
    and |= 00000100 (4) 

    SOME_FLAG set 
    SERVICES_JSON_LOOSE_TYPE set 
    ANOTHER_FLAG set 

foo(6) 
    value| 00000110 (6) 
    flag |& 00000001 (1) 
    and |= 00000000 (0) 

    value| 00000110 (6) 
    flag |& 00000010 (2) 
    and |= 00000010 (2) 

    value| 00000110 (6) 
    flag |& 00000100 (4) 
    and |= 00000100 (4) 

    SOME_FLAG NOT set 
    SERVICES_JSON_LOOSE_TYPE set 
    ANOTHER_FLAG set 

這是如果某一標誌在值設置爲測試方式。
查看php文檔,例如的preg_match_all文檔:

 
flags 
    Can be a combination of the following flags [...] 
    PREG_PATTERN_ORDER [...] 
    PREG_SET_ORDER [...] 
    PREG_OFFSET_CAPTURE [...] 

你會發現這個東西Can be a combination of the following flags...文檔中多次。這些函數/方法背後的代碼完全是使用按位運算符進行檢查的。