Почему вам нужно выполнять двоичную операцию в error_reporting?

Это может показаться глупым вопросом, но я кое-что не понимаю в error_reporting, и мне не удалось найти объяснение на php.net или после исследования в Google.

Ошибка моей локальной рабочей станции:

error_reporting (E_ALL - E_DEPRECATED - E_WARNING);

Все остальные на работе:

error_reporting (E_ALL & ~ E_DEPRECATED & ~ E_WARNING);

У меня вопрос: почему он дает такой же результат? И почему вам нужно использовать бинарную операцию, а не простое вычитание?

Заранее спасибо.


person Bdloul    schedule 21.02.2017    source источник
comment
У меня такое чувство, что их эквивалентность в данном случае - всего лишь случайность. Если это битовые флаги, я бы ожидал, что он будет использовать &.   -  person Carcigenicate    schedule 21.02.2017
comment
бинарные операции обычны для бинарных флагов. также для справки: попробуйте сравнить E_ALL - E_WARNING - E_WARNING с E_ALL & ~E_WARNING & ~E_WARNING   -  person Franz Gleichmann    schedule 21.02.2017


Ответы (1)


Потому что E_DEPRECATED и E_WARNING имеют совершенно разные наборы битов, и вы вычитаете их из E_ALL, где установлены все биты.

Настоящая разница возникает, если вы пытаетесь удалить два раза один и тот же битовый набор или комбинированные битовые наборы. В этом случае вы удалите «биты» более одного раза, что приведет к совершенно неверным значениям.

В общем, вы, вероятно, просто удалите одну опцию из флагов ошибок и не знаете, какие биты в настоящее время установлены.

$level = error_reporting();
// at this point, you simply can't use simple math, as you don't know, if the given error reporting option is set or not
$level = $level & ~E_WARNING;
error_reporting($level);
person Philipp    schedule 21.02.2017