flow/bitwiser

位操作标志管理辅助类

0.1.3 2014-06-23 14:11 UTC

This package is auto-updated.

Last update: 2024-09-18 19:39:23 UTC


README

Bitwiser 是一个实用类,用于帮助管理位操作标志。

位操作标志是一种方便的方式,可以将多个布尔值(标志)存储在基于数据库列的单个整数中。然而,位操作标志的数量受限于系统的整数的最大值(在64位系统上为64,在32位系统上为32)。

示例用法

创建一个扩展 AbstractBitwiser 的类,并将标志声明为类常量。

class PermissionsBitwiser extends AbstractBitwiser
{
    const CAN_EDIT_POSTS = 0;
    const CAN_DELETE_POSTS = 1;
    const CAN_CREATE_USERS = 2;
}

使用初始状态和回调初始化类

$state = 0; // this value is passed by reference

$permissions = new PermissionsBitwiser($state, function (AbstractBitwiser $bitwiser) {
	echo $bitwiser->getState();
});

$permissions->add(PermissionsBitwiser::CAN_EDIT_POSTS); // echoes 1
$permissions->add(PermissionsBitwiser::CAN_DELETE_POSTS); // echoes 3
$permissions->add(PermissionsBitwiser::CAN_CREATE_USERS); // echoes 7
$permissions->remove(PermissionsBitwiser::CAN_DELETE_POSTS); // echoes 5

$permissions->getState(); // int(5)
$permissions->has(PermissionsBitwiser::CAN_EDIT_POSTS); // true
$permissions->has(PermissionsBitwiser::CAN_DELETE_POSTS); // false

使用 ORM(例如 Laravel Eloquent)进行持久化的示例用法

最终目标是持久化整数值到数据库列,同时保持一个干净的面向对象的方法来更新值。

class User extends Model
{
    public function getPermissionsAttribute()
    {
        $state = $this->attributes['permissions']; // Don't pass this by reference
        $self = $this;
        return new PermissionsBitwiser($state, function ($bitwiser) use ($self) {
            $self->permissions = $bitwiser->getState();
        });
    }
}

$user = new User;

$user->permissions->add(PermissionsBitwiser::CAN_CREATE_USERS);

$user->save();

$user->permissions->has(PermissionsBitwiser::CAN_DELETE_POSTS); // false
$user->permissions->has(PermissionsBitwiser::CAN_CREATE_USERS); // true. etc