2012-12-04 10 views
3

我試圖瞭解設置error_reporting值時使用「^」字符和「〜」字符的區別。例如,我已在我的PHP腳本如下: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); 

回答

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 &不E_NOTICE

error_reporting(E_ALL^E_DEPRECATED^E_USER_DEPRECATED^E_NOTICE); 

將意味着除了E_ALL .... E_DEP等

+1

'^'不是'或',它是'xor'。 – DCoder

+0

是的,我剛剛意識到這一點,並修復。謝謝 – kennypu

+0

謝謝 - 所以我正確的結論是(E_ALL&〜E_DEPRECATED&〜E_USER_DEPRECATED&〜E_NOTICE)產生與(E_ALL^E_DEPRECATED^E_USER_DEPRECATED^E_NOTICE)相同的結果? – user982124

0

我認爲更相關的回答你的問題是在對error reporting page on php.net評論,我會在這裏重新發布上市:

E_ALL^E_NOTICE的例子對於我們這些並不完全熟悉按位運算符的人來說有點「混亂」。

如果您希望從目前的水平,無論是未知的水平可能是刪除通知,使用&〜代替:

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

^是異或(位翻轉)操作,實際上會變成通知如果他們以前關閉(在其左側的錯誤級別)。它在這個例子中起作用,因爲E_ALL保證設置E_NOTICE的位,所以當^翻轉時,它實際上被關閉。 &〜(而不是)將總是關閉由右側參數指定的位,無論它們是否打開或關閉。