PHP如果声明混乱

ajn*_*ari 2 php arrays if-statement error-reporting

我一直在使用PHP一段时间,但我偶然发现了一些我无法做出正面或反面的事情.这是我在这里发现的帖子(我相信已被锁定),我理解大部分解决方案,但只有一部分我很困惑.

  if ( ( $number & $error_number ) == $number )
  {
    $error_description[ ] = $description;
  }
Run Code Online (Sandbox Code Playgroud)

我不太确定在这里检查什么.任何帮助表示赞赏.

((完整代码))

<?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 )
);
?>
Run Code Online (Sandbox Code Playgroud)

我知道数组中的键是预定义的PHP常量,但我不确定最后的if语句是如何工作的/它正在评估什么.

new*_*rey 5

&操作是位运算符,其在使用时,会返回一个值的"位",在这两个变量设置,在这种情况下$number$error_number.

如果当前$error_number包含的位数$number,那么它包含该错误(如果这有意义?).

例如(二进制):

0001 & 1000 = 0000
0001 & 0111 = 0001
0110 & 1111 = 0110
Run Code Online (Sandbox Code Playgroud)

结果显示两个值中的位设置(即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
Run Code Online (Sandbox Code Playgroud)