Почему именно этот код делает? А что это за оператор & amp;?

Я искал руководство для 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))

fullCode:

$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 "";

-1

Решение

Таким образом, ваш код просто проверяет, какие типы ошибок у вас есть, и возвращает постоянное имя этого типа ошибки.

Но сначала уточнить, что & Оператор это. Это побитовый оператор И (Также смотрите это как ссылку: Справка — Что означает этот символ в 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_DEPRECATEDoutput 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 
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]