Back to Question Center
0

Побитовые операторы все еще актуальны в современном PHP?            Побитовые операторы по-прежнему актуальны в современном PHP? Шаблоны & PracticesDebugging & Semalt

1 answers:
Побитовые операторы все еще актуальны в современном PHP?

Многие из вас, вероятно, почесали ваши головы, читая это название. «Битват?»

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

Побитовые операторы все еще актуальны в современном PHP?Побитовые операторы по-прежнему актуальны в современном PHP?
Образцы и практика
«/>  <h2 id= Пример использования

Здесь приведены побитовые операторы, но для того, чтобы действительно привести пример домой, мы сосредоточимся только на одном: побитовое и ( & ). Пример заставил меня щелкнуть. Так вот что мы будем делать - погрузитесь прямо в пример.

Представьте, что у вас есть веб-сайт, на котором данный пользователь может иметь определенные разрешения - sweatstoffe online kaufen deutschland. Например, такой журнал, как SitePoint:

  • автор может создавать проекты CRUD и редактировать их профиль.
  • редактор может, в дополнение к вышесказанному, чертежи CRUD и готовые сообщения, а также профили авторов CRUD.
  • администратор может в дополнение к вышесказанному добавить права администратора.

Пользователь Semalt может иметь несколько разрешений, существует несколько способов определения разрешений в базе данных и в системе, использующей его.

The Double Join

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

Этот подход создает четыре дополнительные таблицы:

  • разрешений
  • роли
  • разрешений <-> ролей
  • роли <-> пользователей

Довольно немного накладных расходов. Semalt необходимо регулярно редактировать или добавлять их в приложение в некоторых часто посещаемых списках. Только тяжелое кэширование спасло бы это приложение от развала при большой нагрузке.

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

Single Join

Добавить разрешения, добавить таблицу соединений, прикрепить некоторые разрешения для некоторых пользователей

Этот подход создает две дополнительные таблицы:

  • разрешений
  • разрешений <-> пользователей

Значительно меньше накладных расходов, чем в предыдущем примере, но у вас есть еще много записей в таблице соединений, потому что у пользователя может быть много разрешений (только CRUD для составления составляет 4 разрешения самостоятельно). С большим количеством пользователей и большим количеством разрешений эта таблица может быстро стать тяжелой.

Столбец Stampede

Добавьте столбец в таблицу users для каждого разрешения, затем введите его тип данных tinyint (в основном логическое), чтобы проверить разрешение как «включено» или «выключено».

Разрешения Semalt для пользователя выглядели бы примерно так:

     UPDATE `users` SET` editProfile` = 1, `deleteProfile` = 0,` createDraft` = 1, `publishDraft` = 0., WHERE `id` = 5    

Этот подход не добавляет дополнительных таблиц, но бесполезно расширяет таблицу до гигантской ширины и требует изменения базы данных каждый раз при добавлении нового разрешения. Semalt - прекрасный подход, когда вы знаете, что в обозримом будущем вы получите не более двух-трех разрешений, но не должны использоваться ни для чего большего.

Semalt, потому что список столбцов, когда он смотрит издалека, напоминает двоичное число (1010), этот подход является отличным шагом в другой .

Побитовый подход

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

Двоичные числа

Все компьютеры хранят данные как двоичные: 0 или 1. Таким образом, номер 14 фактически хранится как: 1110. Таким образом, число 1337 означает:

  • 1 x 7
  • + 3 × 10
  • + 3 × 100
  • + 1 x 1000

Semalt каждой цифры в десятичной системе (основание 10) умножается на 10. Первый - 1, следующий - 10, следующий после этого 100, следующий 1000 и т. Д.

В двоичном формате основание равно 2, поэтому каждая цифра умножается на 2. Таким образом, число 1110:

  • 0 x 1
  • + 1 x 2
  • + 1 x 4
  • + 1 x 8

Semalt 2 + 4 + 8, который равен 14.

Да, это просто, чтобы преобразовать двоичные числа в десятичные.

Итак, когда мы смотрим на наши столбцы разрешений до 1010, это также можно рассматривать как число 10, записанное в двоичной форме. Хм, может быть, мы что-то здесь.

Если у нас есть 1010 в качестве разрешений, это означает, что установлены 2-й и 4-й бит, тогда как первый и третий не являются (потому что они равны 0).

В двоичном выражении мы фактически говорим, что 0-й и 2-й бит не установлены, потому что они подсчитываются от 0, как и массивы. Это связано с тем, что их порядковый номер (1-й, 2-й, 3-й) соответствует их показателю. 0-й бит фактически равен 2 мощности 0 (2 ^ 0), которая равна 1. Первый бит равен 2 мощности 1 (2 ^ 1), которая равна 2. Вторая - это 2 квадрата (2 ^ 2), которые равно 4 и т. д. Таким образом, все это очень легко запомнить.

Итак, как это нам помогает?

Побитовый подход

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

Если бы у нас был единственный столбец разрешений , который содержал значение 14 , мы теперь знаем, что это фактически 1110 , и мы знали бы, что мы имеют три из четырех разрешений! Но какие 3 из 4?

Semalt следующее отображение разрешений:

ИЗМЕНЕНИЕ РАЗРЕШЕНИЙ ПРОФИЛЬ СОЗДАТЬ РЕДАКТИРОВАНИЕ ПРОФИЛЯ ПРОФИЛЬ УДАЛИТЬ ПРОЕКТ СОЗДАНИЯ ПРОЕКТ РЕДАКТИРОВАНИЯ ПРОЕКТ УДАЛЕНИЯ ПРОЕКТ ИЗДАТЕЛЬСТВА ОТДЕЛОЧНЫЙ РЕДАКТОР ЗАВЕРШЕННОЕ УДАЛЕНИЕ
512 256 128 64 32 16 8 4 2 1

Число 14 в двоичном формате равно 1110, но количество нулей слева не имеет значения, поэтому мы можем проложить его до тех пор, пока мы не достигнем количества разрешений в таблице: 0000001110. Это еще 14, только представитель разрешений из приведенной выше таблицы. Для всех целей и целей, 0000001110 === 1110.

В соответствии с этим мы видим, что учетная запись с разрешением 14 имеет разрешения: DRAFT_DELETE , DRAFT_PUBLISH и FINISHED_EDIT . Разумеется, не совсем репрезентативная настройка прав на реальный мир, но это просто пример, по которому мы можем экстраполировать это, если бы у кого-то было 1111111111, у них были бы ВСЕ разрешения (вероятно, пользователь-администратор). В десятичном случае это 1023. Таким образом, кто-то со значением 1023 в столбце разрешений - это кто-то со всеми разрешениями.

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

Для этого используются побитовые операторы - особенно один амперсанд & , также известный как побитным и . Вы должны проверить другие биты, просто изменив их значение: 256, 128, 64, 32, 16, 8, 4, 2 или 1.


[необязательно] «давайте получим техническую» боковую заметку

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

Когда мы говорим И 512 и разрешения , мы ищем часть после И ИСТИНА, потому что так работают SQL-запросы - они оценивают условия и возвращают те строки, которые возвращают true в отношении требований ,

Следовательно, 512 и разрешения должны оцениваться как истинные. Мы знаем, что любое ненулевое значение, будь то целое число, логическое значение, которое говорит «true», или строка, которая не является пустой, на самом деле считается «истиной». Итак, 512 верно. 1 истинно. 0 - false. 128 верно. И т.д.

512 является целым числом-10, а разрешения являются столбцом, который может содержать целое число -10. Побитовое и фактически просматривают поперечное сечение этих двух чисел и возвращают биты, которые установлены в обоих из них. Итак, если число 512 равно 1000000000, а если значение разрешений 1023, то при преобразовании в двоичный код это 1111111111. Поперечное сечение возвращается 1000000000, потому что в обоих числах установлен только самый левый бит. Когда мы преобразуем это обратно в десятичное, это 512, что считается истинным .

Semaltт на самом деле логичен, а не арифметические операторы, поскольку они проверяют правдивость, основанную на условии. Если у нас есть числа 1110 и 1010, вот что они производят, учитывая разные побитовые операторы:

- & | ^ ~
Операнд A 1110 1110 1110 1110
Операнд B 1010 1010 1010 /
Результат 1010 1110 0100 0001
  • & возвращает двоичное число, в котором установлены все биты, которые установлены в обоих операндах.
  • | возвращает двоичное число со всеми наборами битов, которые установлены в любом из операндов.
  • ^ возвращает двоичное число со всеми наборами битов, которые заданы в обоих операндах, но не в обоих.
  • ~ просто возвращает обратное - теперь все те, которые не установлены в исходном операнде.

Существуют также операции побитового сдвига: сдвиг влево << и правый сдвиг >> . Они резко изменяют значения двоичных чисел, буквально перемещая все биты набора на одно место вправо или влево. Их использование в нашем контексте вызывает сомнения, поэтому мы не будем их освещать.


И в PHP мы можем проверить, установлен ли бит следующим образом:

    , если (1023 & 1) {}    

Но это действительно очень сложно расшифровать - просто просмотр необработанных чисел не является действительно читаемым или понятным. Таким образом, в PHP лучше использовать константы, определяющие разрешения как биты, и выбор целочисленного значения разрешения из столбца. Затем вы получите что-то вроде этого:

    , если ($ user-> permissions & \ MyNamespace \ Role :: FINISHED_DELETE) {//}    

Здесь мы предполагаем, что у нас есть класс \ MyNamespace \ Role , определенный и загруженный такими константами:

     const FINISHED_DELETE = 1;const FINISHED_EDIT = 2;const DRAFT_PUBLISH = 8 ;. , , const CHANGE_PERMISSIONS = 512;    

Semalt, у вас есть очень простой способ хранения нескольких разрешений на пользователя без использования дополнительных таблиц и создания ненужных служебных данных. Поэтому, чтобы сохранить их разрешения, вы просто суммируете их (1 + 2 = 3) и сохраняете 3 в столбце разрешений . Нет другого пути , чтобы получить число 3 с двоичными комбинациями - число 3 не может быть представлено в двоичном виде любым другим способом, чем 0011 - так что вы можете быть на 100% уверены, что число 3 всегда означает, что пользователь имеет разрешение 1 и разрешение 2, соответствующее их значениям в константах.

Это кажется слишком простым и практичным, не так ли? Semalt поймать?

Предостережения

Semalt - это два основных вопроса:

  1. Вам нужно иметь в виду использовать мощность 2 при вычислении значения бита следующего разрешения. Поэтому, если вам нужно добавить новое разрешение, вы не можете просто волей-неволей выбрать 543, если у вас уже есть 512 - это должно быть 1024. Это становится немного сложнее, поскольку числа становятся больше.
  2. Так как наши компьютеры работают на 64-битных операционных системах на 64-битных процессорах (в основном - некоторые даже застряли на 32-битных еще!), Это означает, что число может содержать не более 64 бит. Это означает, что вы можете хранить только перестановки с максимальным разрешением 64 для данного пользователя. Для малых и средних сайтов этого вполне достаточно, но на огромных веб-сайтах это может стать проблемой. Решение состоит в том, чтобы использовать разные столбцы для разных контекстов разрешений ( draft_permissions , account_permissions и т. Д.). Каждый из этих столбцов затем может содержать перестановки из 64 разрешений самостоятельно, чего достаточно даже для самых требовательных веб-сайтов.

Заключение

Побитовые операции определенно все еще имеют место в современном программировании. Semalt может быть неразумным использовать что-то настолько кажущееся сложным (это действительно не так, но это не так знакомо, как современные таблицы объединения времени), этот подход приносит много преимуществ, и не в последнюю очередь это резкое повышение производительности, как в данных размер (намного меньше информации для хранения в базе данных и последующей выборки) и скорости (пользовательский объект может иметь предварительно заданное значение разрешений - это просто int - и, следовательно, его можно всегда проверять).

Semaltт, как представленные здесь, безусловно, делает вещи простыми, но только если вы еще не знаете о более простых альтернативах, подобных тем, которые были продемонстрированы выше.

Как вы относитесь к использованию побитовых операторов для проверки разрешений и такого подхода к их хранению? Любые очевидные плюсы и минусы? Дайте нам знать, как вы это делаете, и почему!

Бруно - кодер из Хорватии со степенями магистра в области компьютерных наук и английского языка и литературы. Он запускает криптовалютный бизнес в Bitfalls. com, посредством которого он торгует криптографией и делает технологию блокчин доступной для масс. Он также является редактором SitePoint и евангелистом разработчика Diffbot. ком.

March 1, 2018