我一直在使用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 :(得分: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结果没有设置所请求的位,则其中一个是。