Функции, вызывающие ошибки на основе уровня отчетности в PHP

#php #error-handling #bitwise-operators

#php #обработка ошибок #побитовые операторы

Вопрос:

Это глупый вопрос, но, похоже, я не могу разобраться в тестировании битовой маски, связанном с завершением этого:

Учитывая, что я создаю кучу обобщенных функций для расширения функциональной базы PHP:

 /**
 *
 * @param string $path
 * @return array
 */
function load_array($path){
    $path = path_file($path);
    if(null === $path){
        // trigger error when appropriate
        return array();
    }
    return ((Array) require($path));
}
 

path_file() это еще одна функция в библиотеке, просто предположим, что это realpath()

Что я хотел бы сделать, так это запускать ошибки в соответствии с уровнем отчетности текущей рабочей среды. Учитывая, что это будет уведомление, должен ли я просто протестировать:

 if(error_reporting() <= E_USER_NOTICE){ /***/ }
 

Это не кажется правильным.

Комментарии:

1. Это работает наоборот. Вы просто генерируете уведомление, и обработчик ошибок игнорирует его, когда этот уровень отключен. Или почему вы хотели подойти к этому именно так?

2. Спасибо @mario — я всегда иду длинным ( читай, неправильным ) путем. Вы, безусловно, правы в том, что я, по-видимому, не хотел подходить к этому таким образом, но все же сделал.

Ответ №1:

 if (error_reporting() amp; E_USER_NOTICE) {
   ...
}
 

будет срабатывать только в том случае, если флаг E_USER_NOTICE был включен в error_reporting, используя побитовую операцию И .

Если вы притворяетесь, что флаг error_reporting имеет только 8 бит, а флаг USER_NOTICE имеет бит 4, то вы делаете:

   00001000  <--- e_user_notice
  10101111  <--- some fake error_reporting bitmask
amp; --------
  00001000  <-- e_user_notice is enabled. It's non-zero, so evaluates to 'true' in PHP.
 

Комментарии:

1. Спасибо @Marc B — это направление, которое я выяснял 🙂 Было бы просто E_NOTICE уместно здесь; Я полагаю, что нет, поскольку trigger_error() собирается бросить E_USER_*