【问题标题】:Why exactly does this code do? And what kind of operator is &?为什么这段代码会这样做? & 是什么样的运算符?
【发布时间】:2015-07-07 17:22:11
【问题描述】:

我在手册中搜索error_reporting。在那里我找到了一个示例,它列出了浏览器窗口中的所有错误报告级别。我浏览了代码,有些编码风格对我来说似乎很陌生,我无法理解它到底是做什么的。

在手册中,它说error_reporting ()返回:

如果没有级别,则返回旧的error_reporting level 或当前级别 给定参数

我知道error_reporting(level) 决定显示或不显示哪种类型的错误。但是当它被分配给一个变量时它会返回什么?像下面这样:

$errLvl = error_reporting(); 

我打印了$errLvl,它返回了22527。我不明白这是什么意思?谁能用简单的英语给我解释一下?

有一个名为FriendlyErrorType($type) 的函数将接受错误类型并在浏览器中打印。但它被赋予了一个参数($errLvs & pow(2,i))& 操作员应该做什么?我的意思是&运算符在参数中的作用是什么?

print FriendlyErrorType($errLvl & pow(2, $i))

完整代码:

$errLvl = error_reporting();
echo $errLvl.'</br>';
for ($i = 0; $i < 15;  $i++ ) {
    print FriendlyErrorType($errLvl & pow(2, $i)) . "<br>\\n";
}

function FriendlyErrorType($type)
{
    switch($type)
    {
        case E_ERROR: // 1 //
            return 'E_ERROR';
        case E_WARNING: // 2 //
            return 'E_WARNING';
        case E_PARSE: // 4 //
            return 'E_PARSE';
        case E_NOTICE: // 8 //
            return 'E_NOTICE';
        case E_CORE_ERROR: // 16 //
            return 'E_CORE_ERROR';
        case E_CORE_WARNING: // 32 //
            return 'E_CORE_WARNING';
        case E_COMPILE_ERROR: // 64 //
            return 'E_COMPILE_ERROR';
        case E_COMPILE_WARNING: // 128 //
            return 'E_COMPILE_WARNING';
        case E_USER_ERROR: // 256 //
            return 'E_USER_ERROR';
        case E_USER_WARNING: // 512 //
            return 'E_USER_WARNING';
        case E_USER_NOTICE: // 1024 //
            return 'E_USER_NOTICE';
        case E_STRICT: // 2048 //
            return 'E_STRICT';
        case E_RECOVERABLE_ERROR: // 4096 //
            return 'E_RECOVERABLE_ERROR';
        case E_DEPRECATED: // 8192 //
            return 'E_DEPRECATED';
        case E_USER_DEPRECATED: // 16384 //
            return 'E_USER_DEPRECATED';
    }
    return "";

【问题讨论】:

  • 你知道什么是比特吗?如何在字节/整数中设置/获取位?
  • 我知道。但是在这里我们必须发送一个参数。按位运算符需要在那里?
  • 也许可以编辑您的问题以显示(澄清)您了解&amp; 运算符做什么 以及它是什么,但实际上不知道为什么该代码的那部分是否需要它?
  • @Lashane 啊,好的,感谢您的更正。 (我删除了评论)
  • @AL-zami 阅读 en.wikipedia.org/wiki/Mask_%28computing%29 它会让你了解什么是面具

标签: php function error-reporting


【解决方案1】:

所以您的代码只是检查您有哪些错误类型并返回该错误类型的常量名称。

但首先要澄清&amp; 运算符这是什么。这是一个bitwise AND operator(另请参阅:Reference - What does this symbol mean in PHP?)。

所以基本上它是这样做的:

  A    |    B    &   results 
-----------------------------
  0    |    0   ->     0
  0    |    1   ->     0
  1    |    1   ->     1
  1    |    0   ->     0

所以一个简单的英文例子应该是:

如果阳光明媚,而且我今天不必工作,那么我就出去(否则就不用)。


所以现在你的代码只是得到你当前的错误级别:

$errLvl = error_reporting();

对你来说是:

22527  //Which in binary is: 0101'0111 1111'1111

在此之后,它会循环 15 次,基本上总是检查下一个数字是 1 还是 0,例如:

1。迭代:

0101'0111 1111'1111            // your error level
                  1            // pow(2, $i) -> 2^0 -> 1
------------------- &
                  1  =      1  //argument for the function call

2。迭代:

0101'0111 1111'1111            // your error level
                 10            // pow(2, $i) -> 2^1 -> 2
------------------- &
                 10  =      2  //argument for the function call

...

15。迭代:

0101'0111 1111'1111            // your error level
0100'0000 0000'0000            // pow(2, $i) -> 2^14 -> 16384
------------------- &
0100'0000'0000'0000  = 16'384  //argument for the function call

然后在函数中,它只是一个 switch 语句,如果设置了相应的数字,则返回正确的术语。

您还可以在此处查看所有预定义的错误常量:http://php.net/manual/en/errorfunc.constants.php

这里可视化:

0000'0000 0000'0000
|||| |||| |||| |||| ----- E_ERROR              =      1
|||| |||| |||| ||| ------ E_WARNING            =      2
|||| |||| |||| || ------- E_PARSE              =      4
|||| |||| |||| | -------- E_NOTICE             =      8
|||| |||| ||||
|||| |||| |||| ---------- 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        =  1'024
|||| | ------------------ E_STRICT             =  2'048
||||
|||| -------------------- E_RECOVERABLE_ERROR  =  4'096
||| --------------------- E_DEPRECATED         =  8'192
|| ---------------------- E_USER_DEPRECATED    = 16'384
| ----------------------- E_ALL                = 32'767

现在如果你想问为什么它不检查最后一位数字(E_ALL),因为基本上是E_ALL == all error types。因此,如果您返回所有错误类型,您就会收到错误报告:E_ALL


所以最后你的错误级别可视化:

0101'0111 1111'1111
 | |  ||| |||| |||| ----- E_ERROR         
 | |  ||| |||| ||| ------ E_WARNING          
 | |  ||| |||| || ------- E_PARSE   
 | |  ||| |||| | -------- E_NOTICE   
 | |  ||| ||||
 | |  ||| |||| ---------- E_CORE_ERROR      
 | |  ||| ||| ----------- E_CORE_WARNING   
 | |  ||| || ------------ E_COMPILE_ERROR    
 | |  ||| | ------------- E_COMPILE_WARNING 
 | |  |||
 | |  ||| --------------- E_USER_ERROR   
 | |  || ---------------- E_USER_WARNING     
 | |  | ----------------- E_USER_NOTICE    
 | |
 | | -------------------- E_RECOVERABLE_ERROR  
 |  
 | ---------------------- E_USER_DEPRECATED   



output of your code:

E_ERROR 
E_WARNING
E_PARSE  
E_NOTICE
E_CORE_ERROR 
E_CORE_WARNING  
E_COMPILE_ERROR 
E_COMPILE_WARNING 
E_USER_ERROR  
E_USER_WARNING
E_USER_NOTICE
E_RECOVERABLE_ERROR  
E_USER_DEPRECATED 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-13
    相关资源
    最近更新 更多