Intereting Posts
Laravel – порядок промежуточного ПО (приоритет промежуточного ПО). Мульти-арендатор с использованием Postgres Алгоритм Facemash Поиск и замена нескольких значений несколькими / разными значениями в PHP5? Любая идея, почему я должен дважды щелкнуть кнопку выхода из системы, чтобы выйти из системы? PDOException: вы не можете сериализовать или нестиализовать экземпляры PDO Функция / процедура PHP для динамического связывания вопросительных знаков Как я могу наложить водяной знак на уже измененный образ на PHP (используя GD)? Запрошены ли параметризованные запросы в PDO для переменных запроса? странное поведение php array_unique обработка дубликатов записей в mysql Вставка выражения Как получить время и дату из штампа даты и времени в php PHP: неопределенное смещение в explode () Используйте array_multisort () с пользовательской функцией Один фильтр не работает, когда предложение where имеет указанное значение как я могу исправить продолжительность времени, чтобы заполнить форму

Как реализовать битовую маску в php?

Я не уверен, что битмаска – правильный термин. Позволь мне объяснить:

В php функция error_reporting может быть вызвана несколькими способами:

 // Report simple running errors error_reporting(E_ERROR | E_WARNING | E_PARSE); // Reporting E_NOTICE can be good too (to report uninitialized // variables or catch variable name misspellings ...) error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE); // Report all errors except E_NOTICE // This is the default value set in php.ini error_reporting(E_ALL ^ E_NOTICE); 

Я получил термин битмаск с страницы php.net здесь

В любом случае, это я, я реализовал метод SIMPLE с именем ls который возвращает содержимое каталога.

Эта функция принимает 3 аргумента … ($ include_hidden = false, $ return_absolute = false, $ ext = false)

Поэтому, когда я вызываю функцию, я задаю, как мне нужны результаты. Я хочу, чтобы результаты возвращали скрытые каталоги, хочу ли я только базовые имена и т. Д.

поэтому, когда я вызываю функцию, которую я пишу

 ls(true, false, true) ls(false, false, true) ls(true, true, true) etc... 

Я думал, что это будет гораздо более читаемо, если бы я мог просто указать, как я хочу вернуть данные?

так что-то вроде:

 ls( INCLUDE_HIDDEN | HIDE_EXTS ); ls( SHOW_ABSOLUTE_PATHS | HIDE_EXTS ); 

и т.д…

Как мне реализовать это с точки зрения тестирования, какие флаги были вызваны?

    На самом деле это довольно просто. Сначала немного кода, чтобы продемонстрировать, как он может быть реализован. Если вы ничего не понимаете в отношении того, что делает этот код или как он работает, не стесняйтесь задавать дополнительные вопросы в комментариях:

     const FLAG_1 = 0b0001; // 1 const FLAG_2 = 0b0010; // 2 const FLAG_3 = 0b0100; // 4 const FLAG_4 = 0b1000; // 8 // Can you see the pattern? ;-) function show_flags ($flags) { if ($flags & FLAG_1) { echo "You passed flag 1!<br>\n"; } if ($flags & FLAG_2) { echo "You passed flag 2!<br>\n"; } if ($flags & FLAG_3) { echo "You passed flag 3!<br>\n"; } if ($flags & FLAG_4) { echo "You passed flag 4!<br>\n"; } } show_flags(FLAG_1 | FLAG_3); 

    демонстрация


    Поскольку флаги являются целыми числами, на 32-битной платформе вы определяете до 32 флагов. На 64-битной платформе это 64. Также возможно определить флаги как строки, и в этом случае количество доступных флагов более или менее бесконечно (в пределах системных ресурсов, конечно). Вот как он работает в двоичном формате (для простоты сокращается до 8-битных целых чисел).

     FLAG_1 Dec: 1 Binary: 00000001 FLAG_2 Dec: 2 Binary: 00000010 FLAG_3 Dec: 4 Binary: 00000100 // And so on... 

    Когда вы объединяете флаги, чтобы передать их функции, вы ИЛИ их вместе. Давайте посмотрим, что происходит, когда мы передаем FLAG_1 | FLAG_3 FLAG_1 | FLAG_3

      00000001 | 00000100 = 00000101 

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

      00000101 & 00000100 = 00000100 

    … мы получаем значение флага назад, ненулевое целое число, но если мы видим, был ли установлен FLAG_2 :

      00000101 & 00000010 = 00000000 

    … получим нуль. Это означает, что вы можете просто оценить результат операции И как логическое значение при проверке, было ли передано значение.

     define( "INCLUDE_HIDDEN", 0x1 ); define( "HIDE_EXTS", 0x2 ); define( "SHOW_ABSOLUTE_PATHS", 0x4 ); //And so on, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 etc.. 

    Затем вы можете проверить отдельные флаги в своей функции ls :

     if( $flags & INCLUDE_HIDDEN ) { //<-- note just a single &, bitwise and //$flags have INCLUDE_HIDDEN } 

    Другие предложили хорошие предложения, но в наши дни гораздо чаще встречаются ассоциативные массивы, а не битмаски. Он гораздо читабельнее и позволяет передавать другие переменные, кроме значений true / false. Что-то вроде этого:

     myFunction(['includeHidden' => true, 'fileExts' => false, 'string' => 'Xyz']); function myFunction($options) { // Set the default options $options += [ 'includeHidden' => false, 'fileExts' => true, 'string' => 'Abc', ]; if ($options['includeHidden']) { ... } ... }