Maska bitowa uprawnień jest najlepiej rozumiana, gdy jest przedstawiana jako binarna, gdzie każda cyfra reprezentuje uprawnienie, które jest włączone lub wyłączone. Więc jeśli istnieją uprawnienia X, Y i Z, a mam dostęp tylko do X i Z, 101
oznaczałoby, że mam przyznane mi pierwsze i trzecie uprawnienie, ale nie drugie. Liczba binarna 101
jest odpowiednikiem liczby dziesiętnej 5
, więc to właśnie zostanie zapisane w bazie danych. Pojedyncza, mała liczba całkowita jest znacznie bardziej efektywnym obiektem do przechowywania niż łańcuch lub kilka małych liczb całkowitych.
EDYTUJ: Zdałem sobie sprawę, jak łatwo było wykorzystać istniejące funkcje konwersji, aby uruchomić dość szybką implementację. Oto próbka.
<?php
function bitmask_expand($n) {
// 9 returns array(1, 0, 0, 1)
return str_split(base_convert($n, 10, 2));
}
function bitmask_compact($a) {
// array(1, 0, 0, 1) returns 9
return (int) base_convert(implode($a), 2, 10);
}
$ns = range(0, 7);
foreach($ns as $n) {
print_r($b = bitmask_expand($n));
echo bitmask_compact($b), "\n\n";
}
Możesz uzyskać lepszą wydajność, jeśli użyjesz pętli, zamiast cofać się do i od ciągów, ale to dość wyraźnie ilustruje zasadę.