2

PHP の get_defined_constants関数を使用すると、システムと自分で定義されたすべての定数を確認できます。

例:

<?php

define("MY_CONSTANT", 1);
print_r(get_defined_constants(true));

?>

出力:

Array
(
    [Core] => Array
        (
            [E_ERROR] => 1
            [E_RECOVERABLE_ERROR] => 4096
            [E_WARNING] => 2
            [E_PARSE] => 4
            [E_NOTICE] => 8
            [E_STRICT] => 2048
            [E_DEPRECATED] => 8192
            [E_CORE_ERROR] => 16
            [E_CORE_WARNING] => 32
            [E_COMPILE_ERROR] => 64
            [E_COMPILE_WARNING] => 128
            [E_USER_ERROR] => 256
            [E_USER_WARNING] => 512
            [E_USER_NOTICE] => 1024
            [E_USER_DEPRECATED] => 16384
            [E_ALL] => 30719
            [DEBUG_BACKTRACE_PROVIDE_OBJECT] => 1
            [DEBUG_BACKTRACE_IGNORE_ARGS] => 2
....

質問:彼らはどのようにしていくつかの定数の整数値を思いついたのですか? たとえばE_ALL、 の値があり30719ます。なぜ30719乱数ではないのですか?

4

1 に答える 1

8

これはすべてバイナリに帰着します:

[E_ERROR] => 1                 //000000000000001
[E_WARNING] => 2               //000000000000010
[E_PARSE] => 4                 //000000000000100
[E_NOTICE] => 8                //000000000001000
[E_CORE_ERROR] => 16           //000000000010000
[E_CORE_WARNING] => 32         //000000000100000
[E_COMPILE_ERROR] => 64        //000000001000000
[E_COMPILE_WARNING] => 128     //000000010000000
[E_USER_ERROR] => 256          //000000100000000
[E_USER_WARNING] => 512        //000001000000000
[E_USER_NOTICE] => 1024        //000010000000000
[E_STRICT] => 2048             //000100000000000
[E_RECOVERABLE_ERROR] => 4096  //001000000000000
[E_DEPRECATED] => 8192         //010000000000000
[E_USER_DEPRECATED] => 16384   //100000000000000
[E_ALL] => 30719               //111011111111111 (everything but E_STRICT)

E_ERROR と E_USER_ERROR が必要な場合は、ビット単位のORステートメントを実行します。

define("E_ERROR_ALL", E_ERROR | E_USER_ERROR);

これは以下と同じです

000000000000001 //E_ERROR
000000100000000 //E_USER_ERROR
------|-------| 
000000100000001 //Our custom E_ERROR_ALL

とてもORシンプルです:

0 - 0 = 0
0 - 1 = 1
1 - 0 = 1
1 - 1 = 1

チェックするときは、単純にビットAND演算を使用できます。結果が 0 より大きい場合は、そのビットが含まれます。

<?php
    $errorCode = E_PARSE | E_CORE_ERROR;

    if (($errorCode & E_PARSE) > 0) {
        echo "Error code includes E_PARSE" . PHP_EOL;
    }

    if (($errorCode & E_NOTICE) > 0) {
        echo "Error code includes E_NOTICE" . PHP_EOL;
    }

    if (($errorCode & E_CORE_ERROR) > 0) {
        echo "Error code includes E_CORE_ERROR" . PHP_EOL;
    }
?>

出力します

Error code includes E_PARSE
Error code includes E_CORE_ERROR

デモ

これが機能する理由ANDは、次のロジックを使用しているためです。

0 - 0 = 0
0 - 1 = 0
1 - 0 = 0
1 - 1 = 1

したがって、カスタム エラー コード ( 10100) とE_CORE_ERROR( 10000) を照合すると、次の操作が得られます。

    10100
AND 10000
    |----
    10000 = 16 (therefore larger than 0)

E_NOTICE( ) でチェックすると01000、次の操作が実行されます。

    10100
AND 01000
    -----
    00000 = 0 (No match)
于 2013-09-04T11:35:54.820 に答える