Un masque de bits d'autorisations est mieux compris lorsqu'il est représenté sous forme binaire, chaque chiffre représentant une autorisation étant activée ou désactivée. Donc, si les autorisations X, Y et Z existent et que je n'ai accès qu'à X et Z, 101
représenterait que j'ai les première et troisième autorisations qui m'ont été accordées, mais pas la seconde. Le nombre binaire 101
est équivalent au nombre décimal 5
, c'est donc ce qui finirait par être stocké dans la base de données. Un seul petit entier est un objet beaucoup plus efficace à stocker qu'une chaîne ou plusieurs petits entiers.
MODIF : J'ai réalisé à quel point il était facile de tirer parti des fonctions de conversion existantes pour obtenir une mise en œuvre assez rapide. Voici un exemple.
<?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";
}
Vous pourriez obtenir de meilleures performances si vous utilisez des boucles, plutôt que de tirer vers et depuis des chaînes, mais cela illustre assez clairement le principe.