#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_*