Я пытаюсь найти лучший способ использовать битмаску или битовые поля в PHP уже давно для разных областей моего приложения для разных пользовательских настроек и разрешений. Самое дальнее, что я зашел так далеко, - это класс, внесенный svens в Stack Overflow post Бит-маска в PHP для настроек?. Я немного изменил его ниже, изменив его на использование констант класса вместо DEFINE и убедившись, что метод get передается только int. У меня также есть образец кода для тестирования функциональности класса ниже.
Я ищу любые предложения/код, чтобы еще больше улучшить этот класс, чтобы он мог использоваться в моем приложении для настроек и в некоторых случаях для пользовательских разрешений.
Отвечено в комментарии ниже mcrumley
Кроме того, у меня есть вопрос о нумерации моих констант. В других классах и образцах кода для этого типа у него будут вещи, перечисленные в силе 2. Однако, похоже, это работает так же, насколько я могу судить, даже если я числю свои константы 1,2,3,4,5,6 вместо 1, 2, 4, 8, 16 и т.д. Так может ли кто-то уточнить, следует ли мне менять константы?
Некоторые идеи... Я бы очень хотел выяснить способ расширения этого класса, поэтому он прост в использовании с другими классами. Скажем, у меня есть класс User
и Messages
. Оба класса User
и Messages
будут расширять этот класс и иметь возможность использовать битовую маску для своих настроек/разрешений (вместе с другими классами позже). Так что, возможно, текущие константы класса должны быть изменены, чтобы они могли быть переданы или какой-либо другой вариант? Я бы предпочел не определять (определять ( "PERM_READ", 1);) в других частях сайта /script и хотел бы сохранить его несколько инкапсулированным, но гибким; Я открыт для идей. Я хочу, чтобы это было твердо и гибко, как я сказал, чтобы использовать с несколькими другими классами для настроек или разрешений. Возможно, какой-то массив должен использоваться? @Svens из моего предыдущего вопроса, связанного выше, отправил комментарий с "внедрить некоторые автоматические геттеры/сеттеры или ArrayAccess для дополнительного awesomness. - svens". Что вы думаете о чем-то подобном?
Включите пример исходного кода, если возможно, пожалуйста.
<?php
class BitField {
const PERM_READ = 0;
const PERM_WRITE = 1;
const PERM_ADMIN = 2;
const PERM_ADMIN2 = 3;
const PERM_ADMIN3 = 4;
private $value;
public function __construct($value=0) {
$this->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);
}
}
?>
Пример использования...
<?php
$user_permissions = 0; //This value will come from MySQL or Sessions
$bf = new BitField($user_permissions);
// Turn these permission to on/true
$bf->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 '<br> Bitmask value = ' .$user_permissions. '<br>Test values on/off based off the bitmask value<br>' ;
// Check if permission PERM_READ is on/true
if ($bf->get($bf::PERM_READ)) {
// can read
echo 'can read is ON<br>';
}
if ($bf->get($bf::PERM_WRITE)) {
// can write
echo 'can write is ON<br>';
}
if ($bf->get($bf::PERM_ADMIN)) {
// is admin
echo 'admin is ON<br>';
}
if ($bf->get($bf::PERM_ADMIN2)) {
// is admin 2
echo 'admin 2 is ON<br>';
}
if ($bf->get($bf::PERM_ADMIN3)) {
// is admin 3
echo 'admin 3 is ON<br>';
}
?>