phpgears/value-object

PHP 的值对象

0.2 2019-09-22 14:39 UTC

This package is auto-updated.

Last update: 2024-09-21 02:48:09 UTC


README

PHP version Latest Version License

Build Status Style Check Code Quality Code Coverage

Total Downloads Monthly Downloads

value-object

PHP 的不可变值对象

安装

Composer

composer require phpgears/value-object

用法

要求 composer 自动加载文件

require './vendor/autoload.php';

Gears\ValueObject\AbstractValueObject 扩展。使您的类为最终类,值对象应该是最终的

注意受保护的构造函数,您应该为您的值对象创建一个 "命名构造函数"

use Gears\ValueObject\AbstractValueObject;

final class CustomStringValueObject extends AbstractValueObject
{
    private $value;

    public static function fromString(string $value)
    {
        $stringObject = new self();
        $stringObject->value = $value;

        return $stringObject;
    }

    public function getValue(): string
    {
        return $this->value;
    }

    public function isEqualTo($valueObject): bool
    {
        return \get_class($valueObject) === self::class 
            && $valueObject->getValue() === $this->value;
    }
}

序列化

从 AbstractValueObject 扩展并不自动在您的值对象中定义序列化机制,因为值对象可以由多个值、其他值对象甚至其他对象(如枚举)组成

为此,考虑在您的值对象中添加序列化方法以控制序列化过程

use Gears\ValueObject\AbstractValueObject;

final class Money extends AbstractValueObject implements \Serializable
{
    private const CURRENCY_EUR = 'eur';

    private $value;
    private $precision;
    private $currency;

    public static function fromEuro(int $value, int $precision)
    {
        $money = new self();
        $money->value = $value;
        $money->precision = $precision;
        $money->currency = static::CURRENCY_EUR; // Should be an enum

        return $money;
    }

    // [...]

    final public function __serialize(): array
    {
        return [
            'value' => $this->value,
            'precision' => $this->precision,
            'currency' => $this->currency,
        ];
    }

    final public function __unserialize(array $data): void
    {
        $this->assertImmutable();

        $this->value = $data['value'];
        $this->precision = $data['precision'];
        $this->currency = $data['currency'];
    }

    final public function serialize(): string
    {
        return serialize([
            $this->value,
            $this->precision,
            $this->currency,
        ]);
    }

    public function unserialize($serialized): void 
    {
        $this->assertImmutable();

        list(
            $this->value,
            $this->precision,
            $this->currency
        ) = \unserialize($serialized, ['allowed_classes' => false]);
    }
}

枚举和值对象配合得很好,考虑使用 phpgears/enum 进行枚举

贡献

发现了一个错误或有功能请求? 请打开一个新的问题。在提交之前查看现有的问题。

请参阅 CONTRIBUTING.md 文件

许可

有关许可条款的副本,请参阅包含在源代码中的 LICENSE 文件。