-->

2010-02-04

phpのオプションでビット演算を使う場合

この記事は php の error_reporting 関数に関する参考です。

関数のオプションの定数をビット演算で複数指定する場合の確認をします。
print "<pre>\n";
printf("%' 30s | %' 6s | %' 13s\n", "constant", "dec", "bin");
foreach (array("E_ALL", "E_NOTICE", "E_ALL^E_NOTICE", "E_ALL&~E_NOTICE", "LOCK_SH", "LOCK_SH|LOCK_NB", "LOCK_EX", "LOCK_EX|LOCK_NB") as $value)
{
    eval("\$value1 = $value;");  // 良い書き方ではないです。
    printf("%' 30s | %'06d | %'013s\n", $value, $value1, decbin($value1));
}
print "</pre>\n";

例えば、下記の設定は E_ALL に E_STRICT が含まれるかどうかで変わります。
error_reporting(E_ALL &~ E_STRICT);
error_reporting(E_ALL ^ E_STRICT);

例えば E_ALL ^ E_NOTICE は E_ALL に E_NOTICE が含まれるので E_ALL から E_NOTICE を引いた値(E_ALL &~ E_NOTICE と同じ)になり E_ALL ^ E_STRICT は E_ALL に E_STRICT が含まれないので E_ALL | E_STRICT と同じ値になります。

php6 から E_ALL が E_STRICT を含むらしいので注意が必要です。
よって error_reporting に排他的論理和を使うのをやめることをお勧めします。

排他的論理和の例
print (0^0) . "=0\n";
print (0^1) . "=1\n";
print (1^0) . "=1\n";
print (1^1) . "=0\n";

例えば E_XXX &~ E_NOTICE は E_NOTICE のビットを0にしたいことが明白で
E_XXX ^ E_NOTICE は E_XXX の E_NOTICE のビットが、0の時1にして、1の時0にします。

(例) pear を使うので E_STRICT をOFFにする。
error_reporting(E_ALL &~ E_STRICT);
//set_error_handler("exception_error_handler", E_ALL &~ E_STRICT);

また .htaccess にエラーレベルを指定する場合には、番号になるので auto_prepend_file などに php のコード(error_reporting(XXX);)として書くほうが良いです。

0 件のコメント: