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