3

在设置 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);
}

我在以下位置阅读了手册页:

http://php.net/manual/en/function.error-reporting.php

但我现在比以往任何时候都更加困惑。是:

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

相同:

error_reporting(E_ALL ^ E_DEPRECATED ^ E_USER_DEPRECATED ^ E_NOTICE);
4

2 回答 2

2

这些是按位运算符: http: //php.net/manual/en/language.operators.bitwise.php

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

将意味着 E_ALL 和 NOT E_DEPRECATED 和 NOT E_USER_DEPRECATED & NOT E_NOTICE

尽管

error_reporting(E_ALL ^ E_DEPRECATED ^ E_USER_DEPRECATED ^ E_NOTICE);

将意味着 E_ALL 除了 E_DEP.... 等等。

于 2012-12-04T05:11:20.957 回答
0

我认为与您的问题更相关的答案列在php.net 上的错误报告页面的评论中,我将在此处重新发布:

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

如果您希望从当前级别删除通知,无论未知级别是什么,请使用 & ~ 代替:

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

^ 是 xor(位翻转)运算符,如果之前关闭通知(在其左侧的错误级别),它实际上会打开通知。它在示例中有效,因为 E_ALL 保证设置了 E_NOTICE 位,因此当 ^ 翻转该位时,它实际上已关闭。& ~ (而不是)将始终关闭右手参数指定的位,无论它们是打开还是关闭。

于 2013-02-08T08:51:33.217 回答