2012-06-30 3 views
14

Попытка понять эту запись в руководстве по php на debug_backtrace.Использование битовой маски PHP debug_backtrace

Я не понимаю, что они подразумевают под «этот параметром является битовым для ....»

Я сделал поиск в Интернете по битмаске и моя кружится голова круглой, так что я решил, что я не действительно хочу узнать подробности об этом, но просто знать, как я могу добавить варианты этой функции.

ли я помещал в обоих вариантах, как в

debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT, DEBUG_BACKTRACE_IGNORE_ARGS) 

, если я хочу, как и один из них, если я только хочу, чтобы один?

ответ

8

Это означает, что вы комбинируете опции с побитовым оператором ИЛИ: |.

Например:

debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS); 

Для получения более подробной информации о битмаске: http://en.wikipedia.org/wiki/Mask_(computing)

10

константа будет иметь значение 2^п в десятичном, или (10)^п в двоичной системе. Например, 1, 10, 100, 1000 и т. Д. (В двоичном формате).

Say a=001, b=010, c=100:

Вы можете сделать побитовое или, например, a и b. Это будет означать, что каждый бит будет включен, если тот же бит в a или b включен.

a | b == 011 

Это битовая маска. Битовая проверяется на включение a по

bitmask & a != 0 

Который является

011 & 001 == 001 != 0 

Однако, поскольку с не в битовую:

bitmask & c == 011 & 100 == 0 

Таким образом, чтобы включать в себя как и b в битовой маске, вы используете двоичный код или.

debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS); 
+0

+1, любите, как вы это объяснили – Wh1T3h4Ck5

+0

Да ... очень ясно. Принял предыдущий, потому что он пришел первым, но проголосовал за это с признательностью. Небольшой вопрос о том, можно ли загрузить битмаску в php-переменную '$ x = a | b; 'или нет. – Dayo

+1

Да, это битовая маска просто целое, поэтому ее можно использовать так же, как и любое другое выражение. –

11

Следует помнить, что эти 2 константы (DEBUG_BACKTRACE_PROVIDE_OBJECT, DEBUG_BACKTRACE_IGNORE_ARGS) различны по смыслу. Хотя DEBUG_BACKTRACE_PROVIDE_OBJECT предоставляет дополнительный объект, если он присутствует, DEBUG_BACKTRACE_IGNORE_ARGS переносит аргументы, если они присутствуют.

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

debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); 

НЕ

// false friend! 
debug_backtrace(DEBUG_BACKTRACE_PROVIDE_OBJECT | DEBUG_BACKTRACE_IGNORE_ARGS); 

Он переопределяет значение по умолчанию DEBUG_BACKTRACE_PROVIDE_OBJECT и дополнительно игнорирует DEBUG_BACKTRACE_IGNORE_ARGS.

+0

Просто, как я хотел, чтобы это объяснялось. –

Смежные вопросы