phpgears / value-object
PHP 的值对象
0.2
2019-09-22 14:39 UTC
Requires
- php: ^7.1
- phpgears/immutability: ~0.2
Requires (Dev)
- brainmaestro/composer-git-hooks: ^2.1
- friendsofphp/php-cs-fixer: ^2.0
- infection/infection: ^0.9
- phpmd/phpmd: ^2.0
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ~0.11.12
- phpstan/phpstan-deprecation-rules: ~0.11.2
- phpstan/phpstan-strict-rules: ~0.11.1
- phpunit/phpunit: ^7.0|^8.0
- povils/phpmnd: ^2.0
- roave/security-advisories: dev-master
- sebastian/phpcpd: ^4.0
- squizlabs/php_codesniffer: ^3.0
- thecodingmachine/phpstan-strict-rules: ^0.10.2
This package is auto-updated.
Last update: 2024-09-21 02:48:09 UTC
README
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 文件。