2014-01-14 145 views
2

我一直在使用PHP一段時間,但我偶然發現了一些我無法做出正面或反面的東西。這是我在這裏找到的一篇文章(我相信這篇文章已被鎖定),並且我理解了這個解決方案的大部分內容,但只有一部分我感到困惑。PHP如果語句混淆

if (($number & $error_number) == $number) 
    { 
    $error_description[ ] = $description; 
    } 

我不太清楚在這裏檢查什麼。任何幫助表示讚賞。

((完整代碼))

<?php 

$error_number = 22527; //could also use ini_get('error_reporting') 
$error_description = array(); 
$error_codes = array(
    E_ERROR    => "E_ERROR", 
    E_WARNING   => "E_WARNING", 
    E_PARSE    => "E_PARSE", 
    E_NOTICE    => "E_NOTICE", 
    E_CORE_ERROR   => "E_CORE_ERROR", 
    E_CORE_WARNING  => "E_CORE_WARNING", 
    E_COMPILE_ERROR  => "E_COMPILE_ERROR", 
    E_COMPILE_WARNING => "E_COMPILE_WARNING", 
    E_USER_ERROR   => "E_USER_ERROR", 
    E_USER_WARNING  => "E_USER_WARNING", 
    E_USER_NOTICE  => "E_USER_NOTICE", 
    E_STRICT    => "E_STRICT", 
    E_RECOVERABLE_ERROR => "E_RECOVERABLE_ERROR", 
    E_DEPRECATED   => "E_DEPRECATED", 
    E_USER_DEPRECATED => "E_USER_DEPRECATED", 
    E_ALL    => "E_ALL" 
); 
foreach($error_codes as $number => $description) 
{   
    if (($number & $error_number) == $number) 
    { 
     $error_description[ ] = $description; 
    } 
} 
echo sprintf(
    "error number %d corresponds to:<br>\n%s", 
    $error_number, 
    implode(" | ", $error_description) 
); 
?> 

我的理解是關鍵的數組中是預定義的PHP常量,但我不知道怎麼說最後if語句是工作/什麼它的評估。

+0

http://www.php.net/manual/en/language.operators.bitwise.php – Rottingham

+0

種那樣使用位屏蔽。如果您注意到error_reporting(http://www.php.net/manual/en/function.error-reporting.php)函數,則您使用OR(|)值;在按位世界中,OR代表「+」; – Gasim

+0

按位值。請參閱php文檔。 – makallio85

回答

1

&是按位AND運算符。詳細瞭解按位邏輯操作如何工作here

在這種情況下,第一個數字是所謂的位字段,意思是所有位代表不同的錯誤。通過執行帶有相關錯誤掩碼的AND - 如果結果爲0,則沒有設置所請求的位,否則其中一個是。

5

&操作者是一個其Bitwise Operator,當使用時,將返回一個值與所述的「位」中兩個變量設置,在這種情況下$number$error_number

如果當前$error_number包含$number的位,那麼它包含該錯誤(如果這是有意義的?)。

例如(二進制):

0001 & 1000 = 0000 
0001 & 0111 = 0001 
0110 & 1111 = 0110 

結果表明在兩值AND ED一起值,其中有一個位設置(即1)。

又如(用錯誤編號):

$error_number = E_USER_DEPRECATED | E_WARNING | E_ERROR; 

if ($error_number & E_WARNING) echo 'E_WARNING'; // will output 
if ($error_number & E_PARSE) echo 'E_PARSE'; // will not output