Страница 1 из 1

Управление выводом ошибок в PHP

СообщениеДобавлено: 08 апр 2015, 14:50
Александр
Недавно у меня при установке на хостинг Timeweb немного модифицированного форума PHPBB 3 и потом попытке создать тему, вылезло сообщение:
Parse error: syntax error, unexpected T_FUNCTION in /home/e/eost/interforum/public_html/posting.php on line 667
Оказалось, что по умолчанию на хостинге работает версия PHP 5.2. А у меня в скрипте в preg_replace_callback используется анонимная функция в качестве второго параметра. А анонимные функции стали поддерживаться, оказывается, только с версии PHP 5.3.0. Ну хорошо, хоть хостер предоставляет возможность выбрать версию интерпретатора (5.2, 5.3, 5.4), я врубил 5.4. Это сообщение, естественно, пропало, но появились другие:
Strict Standards: call_user_func() expects parameter 1 to be a valid callback, non-static method phpbb_captcha_gd::get_instance() should not be called statically in /home/e/eost/interforum/public_html/includes/captcha/captcha_factory.php on line 38

Теперь оказалось, что с версии PHP 5.4 и выше E_STRICT стал частью E_ALL. Уровень вывода ошибок в моей версии форума задаётся в файле common.php в корне сайта. Там стояло E_ALL ^ E_NOTICE ^ E_DEPRECATED. Поменял на:
Код: Выделить всё
// error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);
error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT);
Сообщение пропало. Потом буду думать, как эти ошибки пофиксить.
Кстати, E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT то же самое, что и E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_STRICT, учитывая, что E_ALL – это число 32767, у которого в двоичном представлении во всех разрядах единицы стоят (1111111111111112).
Кстати, использование этих констант за пределами PHP, например в файле .htaccess или httpd.conf невозможно. Там нужно десятичные значения указывать, которые будут интерпретированы как битовая маска. Т. е., например E_ALL ^ E_NOTICE ^ E_DEPRECATED ^ E_STRICT будет выражаться десятичным числом 22519 (1010111111101112). Но есть еще проблема того, что значение константы «E_ALL» может в будущем меняться, поэтому рекомендуют там, где мы хотим применить битовую маску, где во всех разрядах стоят единицы, использовать большое число, например, 2147483647 (на 32-разряных машинах оно будет в двоичном виде как 11111111111111111111111111111112).
В общем, меня это немного озаботило, я решил разобраться, потом напишу следующий пост подробнее про уровни ошибок PHP и битовые операции с ними.