ornament/位标志

Ornament ORM 的位标志装饰器

0.7.1 2022-11-01 16:56 UTC

README

Ornament ORM 的位标志装饰器

对于具有属性 'status' 的模型 Foo,我们经常想定义多个位标志,例如 'status_on = 1','status_valid = 2' 等。位标志装饰器使这变得很容易。

创建一个后端枚举来定义所需的标志。将属性类型提示为接收此类 Bitflag,并将属性 Ornament\Bitflag\Options 添加到该属性。Options 的参数是枚举的类名。

枚举的所有定义情况现在都可以神奇地用于在位标志属性上获取和设置属性

<?php
<?php

use Ornament\Core;
use Ornament\Bitflag\{ Bitflag, Options };

enum Status : int
{
    case on = 1;
    case initialized = 2;
}

class Model
{
    use Core\Model;

    #[Options(Status::class)]
    public Bitflag $status;
}

$model = Model::fromIterable(['status' => 3]);

// Now this works, assuming `$model` is the instance:
var_dump($model->status->on); // true in this example, since 3 & 1 = 1
$model->status->on = true; // bit 1 is now on (status |= 1)
$model->status->on = false; // bit 1 is now off (status &= ~1)
var_dump($model->status->initialized); // true, since 2 & 2 = 2

位标志属性也支持 JSON 序列化(通过 Ornament\Bitflag\Property::jsonSerialize())。将导出一个 true/false 值的映射。同样,getArrayCopy 方法将返回一个哈希表,其中包含设置位为 true 的标志/位。

访问底层位值

您不需要这样做;只需使用后端枚举即可

<?php

echo Status::on->value; // 1

类似地,如果需要所有可能的值,请使用 Status::cases()