Объясните операции для этого метода, используя побитовые операторы

Может кто-нибудь, пожалуйста, объясните побитовую логику этого метода? он принимает уровень ошибки 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;
}

1

Решение

$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 в этой битовой маске.

3

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

Написание этого:

$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
);
}
1

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