Кто-нибудь может объяснить разницу между error_reporting(E_ALL); и error_reporting(E_ALL & ~E_NOTICE);?
Я заметил, что когда я меняю с E_ALL на E_ALL & ~E_NOTICE, ошибка, которую я хакал, исчезает.
Кто-нибудь может объяснить разницу между error_reporting(E_ALL); и error_reporting(E_ALL & ~E_NOTICE);?
Я заметил, что когда я меняю с E_ALL на E_ALL & ~E_NOTICE, ошибка, которую я хакал, исчезает.
E_ALL это "все"
E_ALL & ~E_NOTICE — это «все, кроме уведомлений».
Уведомления — это наименее срочные сообщения. Но они могут быть очень полезны для отлова глупых ошибок программиста, например, попытки чтения из хэша с несуществующим ключом и т. д.
(Чтобы понять синтаксис, ознакомьтесь с побитовыми операторами)
E_ALL, если все ошибки и предупреждения и уведомления - все
E_NOTICE — это специальный уровень ошибок, показывающий то, что не вызовет ошибок, но не является хорошим или устареет в будущих версиях PHP. Уровень ошибки уведомления предназначен для поощрения лучших практик.
Также следует error_reporting(E_ALL ^ E_NOTICE); сообщать обо всем, кроме уведомления.
Во время разработки рекомендуется установить отчет об ошибках на E_ALL и исправить все ошибки уведомлений.
просмотр руководства даст гораздо больше деталей.
E_ALL — это флаг E_NOTICE — это тоже флаг
поэтому, когда вы выполняете побитовую операцию ~, которая НЕ является, вы исключаете E_NOTICE из E_ALL
Под капотом происходит следующее
в десятичном виде
E_ALL = 32767
E_NOTICE = 8
они сила 2
побитовый
E_ALL = 111111111111111
E_NOTICE = 000000000001000
результат НЕ будет
111111111110111
тогда php может внутренне проверить, включены ли уведомления с оператором & (И)
111111111110111
000000000001000
1 & 0 = 0 значит выключено. Однако, если вы не использовали ~ NOT, тогда это будет 1 & 1 = 1, это означает, что флаг установлен.
Существуют и другие варианты, например, ИЛИ для включения флага или XOR для изменения флага в противоположное состояние. По сути, так работают флаги.