Может кто-нибудь, пожалуйста, объясните побитовую логику этого метода? он принимает уровень ошибки php и возвращает, если он фатален или нет. Я хотел бы понять, что именно происходит.
public static function isLevelFatal($level)
{
$errors = E_ERROR;
$errors |= E_PARSE;
$errors |= E_CORE_ERROR;
$errors |= E_CORE_WARNING;
$errors |= E_COMPILE_ERROR;
$errors |= E_COMPILE_WARNING;
return ($level & $errors) > 0;
}
$foo |= $bar
это просто сокращение для $foo = $foo | $bar
;
Это, кстати, работает со многими другими операторами, такими как $foo += 42
,
Так что этот код эквивалентен:
$errors = E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING;
Таким образом, он создает маску из всех фатальных ошибок, а затем говорит вам, $level
в этой битовой маске.
Написание этого:
$errors = E_ERROR;
$errors |= E_PARSE;
$errors |= E_CORE_ERROR;
$errors |= E_CORE_WARNING;
$errors |= E_COMPILE_ERROR;
$errors |= E_COMPILE_WARNING;
Это то же самое, что написать это:
$errors = E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR;
В качестве альтернативы, написано так, что битовая маска очевидна:
<?php
$errors = E_ERROR;
echo str_pad(decbin($errors), 10, ' ', STR_PAD_LEFT) . "\n";
$errors |= E_PARSE;
echo str_pad(decbin($errors), 10, ' ', STR_PAD_LEFT) . "\n";
$errors |= E_CORE_ERROR;
echo str_pad(decbin($errors), 10, ' ', STR_PAD_LEFT) . "\n";
$errors |= E_CORE_WARNING;
echo str_pad(decbin($errors), 10, ' ', STR_PAD_LEFT) . "\n";
$errors |= E_COMPILE_ERROR;
echo str_pad(decbin($errors), 10, ' ', STR_PAD_LEFT) . "\n";
$errors |= E_COMPILE_WARNING;
echo str_pad(decbin($errors), 10, ' ', STR_PAD_LEFT) . "\n";
Будет производить этот вывод:
1
101
10101
110101
1110101
11110101
Это просто создает битовую маску за раз. Сравнение тогда немного сравнение того, прошло ли $level
в 11110101
например.:
11110101 # the mask
1 # E_ERROR in this? yes
10 # E_WARNING in this? no
То есть намерение точно так же, как:
public static function isLevelFatal($level)
{
return in_array(
$level,
[
E_ERROR,
E_PARSE,
E_CORE_ERROR,
E_CORE_WARNING,
E_COMPILE_ERROR,
E_COMPILE_WARNING
);
}