Я уже давно пытался придумать лучший способ использовать битовую маску или битовые поля в PHP для разных областей моего приложения для разных пользовательских настроек и разрешений. Самое большое, что я зашел, - это класс, предоставленный svens в Stack Overflow.
Я уже давно пытался придумать лучший способ использовать битовую маску или битовые поля в PHP для различных областей моего приложения для разных пользовательских настроек и разрешений. Самое большое, что я зашел, - это класс, предоставленный svens в Stack Overflow.
Я уже давно пытался найти лучший способ использовать битовую маску или битовые поля в PHP для различных областей моего приложения для разных пользовательских настроек и разрешений. Самое большое, на что я пришел, - это класс, добавленный svens в Stack Overflow. post Битовая маска в PHP для настроек? . Я немного изменил его ниже, изменив его, чтобы использовать константы класса вместо DEFINE, и убедившись, что методу get передается только int. У меня также есть образец кода для проверки функциональности класса, приведенного ниже.
Я ищу любые предложения / код для улучшения этого класса еще больше, чтобы его можно было использовать в моем приложении для настроек и, в некоторых случаях, разрешений пользователей.
Отвечено в комментарии ниже Макрамли
Кроме того, у меня есть вопрос о нумерации моих констант. В других классах и образце кода для этого типа элементы будут перечислены в степени 2. Однако, насколько я могу судить, он работает так же, даже если я нумерую свои константы 1,2,3,4,5,6 вместо 1, 2, 4, 8, 16 и т. д. Так может ли кто-нибудь прояснить, следует ли мне изменять свои константы?
Некоторые идеи ... Я действительно хотел бы найти способ расширить этот класс, чтобы его было легко использовать с другими классами. Допустим, у меня есть класс User
и класс Messages
. Оба класса Пользователь
и Сообщения
будут расширять этот класс и смогут использовать битовую маску для своих настроек / разрешений (вместе с другими классами позже). Так, может быть, следует изменить константы текущего класса, чтобы их можно было передать, или какой-то другой вариант? Я действительно предпочел бы не определять (define ('PERM_READ', 1);) в других частях сайта / скрипта и хотел бы, чтобы он был несколько инкапсулирован, но также гибок; Я открыт для идей. Я хочу, чтобы это было надежно и гибко, как я сказал, для использования с несколькими другими классами для настроек или разрешений. Может быть, использовать какой-то массив? @Svens из моего предыдущего вопроса, ссылка на который приведена выше, опубликовала комментарий со словами «реализовать несколько автоматических методов получения / установки или ArrayAccess для дополнительной безопасности. - svens» Что вы думаете о чем-то подобном?
Включите пример исходного кода, если возможно, пожалуйста .
value = $value;
}
public function getValue() {
return $this->value;
}
public function get($n) {
if (is_int($n)) {
return ($this->value & (1 << $n)) != 0;
}else{
return 0;
}
}
public function set($n, $new=true) {
$this->value = ($this->value & ~(1 << $n)) | ($new << $n);
}
public function clear($n) {
$this->set($n, false);
}
}
?>
Пример использования ...
set($bf::PERM_READ);
$bf->set($bf::PERM_WRITE);
$bf->set($bf::PERM_ADMIN);
$bf->set($bf::PERM_ADMIN2);
$bf->set($bf::PERM_ADMIN3);
// Turn permission PERM_ADMIN2 to off/false
$bf->clear($bf::PERM_ADMIN2); // sets $bf::PERM_ADMIN2 bit to false
// Get the total bit value
$user_permissions = $bf->getValue();
echo '
Bitmask value = ' .$user_permissions. '
Test values on/off based off the bitmask value
' ;
// Check if permission PERM_READ is on/true
if ($bf->get($bf::PERM_READ)) {
// can read
echo 'can read is ON
';
}
if ($bf->get($bf::PERM_WRITE)) {
// can write
echo 'can write is ON
';
}
if ($bf->get($bf::PERM_ADMIN)) {
// is admin
echo 'admin is ON
';
}
if ($bf->get($bf::PERM_ADMIN2)) {
// is admin 2
echo 'admin 2 is ON
';
}
if ($bf->get($bf::PERM_ADMIN3)) {
// is admin 3
echo 'admin 3 is ON
';
}
?>