PHP错误报告-使用^&引用;性格与“个性”~&引用;性格

PHP错误报告-使用^&引用;性格与“个性”~&引用;性格,php,error-reporting,Php,Error Reporting,我试图理解设置错误报告值时使用“^”字符和“~”字符之间的区别。例如,我的php脚本中有以下内容: if (version_compare(PHP_VERSION, '5.3.0') >= 0) { error_reporting(E_ALL & ~ E_DEPRECATED & ~ E_USER_DEPRECATED & ~ E_NOTICE); } else { error_reporting(E_ALL ^ E_NOTICE); } 我已在以下位置阅读了手册

我试图理解设置错误报告值时使用“^”字符和“~”字符之间的区别。例如,我的php脚本中有以下内容:

if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
error_reporting(E_ALL & ~ E_DEPRECATED & ~ E_USER_DEPRECATED & ~ E_NOTICE);
} else {
error_reporting(E_ALL ^ E_NOTICE);
}
我已在以下位置阅读了手册页:

但我现在比以前更困惑了。是:

error_reporting(E_ALL & ~ E_DEPRECATED & ~ E_USER_DEPRECATED & ~ E_NOTICE);
同:

error_reporting(E_ALL ^ E_DEPRECATED ^ E_USER_DEPRECATED ^ E_NOTICE);

这些是按位运算符:

这意味着E_ALL而不是E_DEPRECATED,也不是E_USER_DEPRECATED&不是E_NOTICE

error_reporting(E_ALL ^ E_DEPRECATED ^ E_USER_DEPRECATED ^ E_NOTICE);

这意味着除E_DEP…外的所有E_。。。。等等。

我想对你的问题更相关的答案列在我将在这里转载的评论中:

E_ALL^E_NOTICE的例子对于我们这些不完全熟悉按位运算符的人来说有点让人困惑

如果希望从当前级别(无论未知级别如何)删除通知,请使用&~替换:

<?php
//....
$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//...code that generates notices
error_reporting($errorlevel);
//...
?>

^是xor(位翻转)运算符,如果以前关闭了通知(在其左侧的错误级别),则实际上会打开通知。它在本例中起作用,因为E_ALL保证设置了E_通知位,所以当^flips该位时,它实际上是关闭的(and not)将始终关闭右侧参数指定的位,无论它们是否打开或关闭


^
不是
,而是
xor
。谢谢-那么我的结论(E_ALL&~E_DEPRECATED&~E_USER_DEPRECATED&~E_NOTICE)与(E_ALL^E_DEPRECATED^E_USER_DEPRECATED^E_NOTICE)产生的结果相同吗?
<?php
//....
$errorlevel=error_reporting();
error_reporting($errorlevel & ~E_NOTICE);
//...code that generates notices
error_reporting($errorlevel);
//...
?>