2014-01-14 142 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