php - php 开发人员如何选择默认常量值?

标签 php constants

通过使用 get_defined_constants来自 php 的函数,我可以看到系统和我自己定义的所有常量。

示例:

<?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 而不是随机数?

最佳答案

这一切都归结为二进制:

[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

DEMO

之所以可行,是因为 AND 使用了以下逻辑:

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

因此,如果我们根据 E_CORE_ERROR (10000) 检查我们的自定义错误代码 (10100),我们将得到以下操作:

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

但是如果我们使用E_NOTICE (01000) 进行检查,则会执行以下操作:

    10100
AND 01000
    -----
    00000 = 0 (No match)

关于php - php 开发人员如何选择默认常量值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18612645/

相关文章:

Objective-C 静态常量变量

javascript - ES6如何使用if语句声明一个新变量? JavaScript

c++ - 防止更改作为指针返回的对象

c++ - 返回的对象如何分配?

javascript - 如何在 PHP 中访问嵌套数组的变量

php postfix 不发送电子邮件

php - 尝试制作 Android 服务

c++ - 指针与 const 和重载的交互

php - 如何使用数据库中存在的文件进行压缩下载?

php - 从巨大的数组 : optimization question 批量插入 MySql