为什么你必须在error_reporting中进行二进制运算?

Why do you have to do a binary operation in error_reporting?

提问人:Bdloul 提问时间:2/21/2017 最后编辑:JaapBdloul 更新时间:2/22/2017 访问量:111

问:

这听起来像是一个愚蠢的问题,但我对error_reporting有一些不明白的地方,我无法在 php.net 或在谷歌上研究后找到解释。

我的本地工作站错误是这样的:

error_reporting(E_ALL - E_DEPRECATED - E_WARNING);

工作中的其他人都是:

error_reporting(E_ALL & ~E_DEPRECATED & ~E_WARNING);

我的问题是:为什么它给出相同的结果?为什么你必须使用二进制运算而不是简单的减法?

先谢谢你。

PHP 错误报告

评论

0赞 Carcigenicate 2/21/2017
我有一种感觉,在这种情况下,它们是等价的,这只是偶然。如果这些是位标志,我希望它使用 .&
0赞 Franz Gleichmann 2/21/2017
二进制操作是二进制标志的习惯。另外,供参考:尝试与E_ALL - E_WARNING - E_WARNINGE_ALL & ~E_WARNING & ~E_WARNING

答:

0赞 Philipp 2/22/2017 #1

因为设置了完全不同的位,并且您从所有位中减去它们。E_DEPRECATEDE_WARNINGE_ALL

如果尝试删除两次相同的位集或组合位集,则会出现真正的差异。在这种情况下,您将多次删除“位”,这会导致完全错误的值。

通常,您可能只是从错误标志中删除一个选项,并且不知道当前设置了哪些位

$level = error_reporting();
// at this point, you simply can't use simple math, as you don't know, if the given error reporting option is set or not
$level = $level & ~E_WARNING;
error_reporting($level);