PHP如果声明混乱

时间:2014-01-14 20:33:15

标签: php arrays if-statement error-reporting

我一直在使用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语句是如何工作的/它正在评估的内容。

2 个答案:

答案 0 :(得分:5)

&运算符是Bitwise Operator,使用时会返回两个变量中都设置了“位”的值,在这种情况下$number$error_number

如果当前$error_number包含$number的位,则它包含该错误(如果这有意义?)。

例如(二进制):

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

结果显示两个值1一起设置位(即AND)的值。

另一个例子(错误号码):

$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

答案 1 :(得分:1)

&是按位AND运算符。阅读按位逻辑运算如何工作here

在这种情况下,第一个数字是所谓的位域,意味着所有位代表不同的错误。通过使用相关错误的掩码执行AND - 如果0结果没有设置所请求的位,则其中一个是。