为什么这段代码会起作用? & 是一个什么样的运算符?
Why exactly does this code do? And what kind of operator is &?
我在手册中搜索 error_reporting
。在那里我找到了一个示例,它列出了浏览器中的所有错误报告级别 window。我浏览了代码,有些编码风格对我来说似乎很陌生,我无法理解它到底做了什么。
在手册中,它说 error_reporting ()
returns:
Returns the old error_reporting level
or the current level if no level
parameter is given
我知道 error_reporting(level)
决定显示或不显示哪种类型的错误。但是当它被分配给一个变量时,它 returns 是什么?像下面这样:
$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 "";
所以您的代码只是检查您遇到的错误类型和return该错误类型的常量名称。
但首先要弄清楚这是什么 &
运算符。这是一个 bitwise AND operator (Also see this as reference: Reference - What does this symbol mean in PHP?).
所以基本上它是这样做的:
A | B & results
-----------------------------
0 | 0 -> 0
0 | 1 -> 0
1 | 1 -> 1
1 | 0 -> 0
所以一个简单的英语例子是:
If the sun is shining AND it I don't have to work at this day THEN I go outside (otherwise NOT).
所以现在您的代码只获取您当前的错误级别:
$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 语句,如果设置了相应的数字,则将正确的术语设为 return。
您还可以在此处查看所有预定义的错误常量: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
我在手册中搜索 error_reporting
。在那里我找到了一个示例,它列出了浏览器中的所有错误报告级别 window。我浏览了代码,有些编码风格对我来说似乎很陌生,我无法理解它到底做了什么。
在手册中,它说 error_reporting ()
returns:
Returns the old
error_reporting level
or the current level if no level parameter is given
我知道 error_reporting(level)
决定显示或不显示哪种类型的错误。但是当它被分配给一个变量时,它 returns 是什么?像下面这样:
$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 "";
所以您的代码只是检查您遇到的错误类型和return该错误类型的常量名称。
但首先要弄清楚这是什么 &
运算符。这是一个 bitwise AND operator (Also see this as reference: Reference - What does this symbol mean in PHP?).
所以基本上它是这样做的:
A | B & results
-----------------------------
0 | 0 -> 0
0 | 1 -> 0
1 | 1 -> 1
1 | 0 -> 0
所以一个简单的英语例子是:
If the sun is shining AND it I don't have to work at this day THEN I go outside (otherwise NOT).
所以现在您的代码只获取您当前的错误级别:
$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 语句,如果设置了相应的数字,则将正确的术语设为 return。
您还可以在此处查看所有预定义的错误常量: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