Улучшить этот класс битового поля PHP для настроек / разрешений?

Я уже давно пытался придумать лучший способ использовать битовую маску или битовые поля в 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
'; } ?>

14
задан Community 23 May 2017 в 10:29
поделиться