estvoyage / value
一组完整值,用于避免使用原生PHP类型,更多信息请见 http://c2.com/cgi/wiki?ValueObject
dev-master
2015-04-06 18:42 UTC
Requires
- php: >=5.4.0
Requires (Dev)
- mageekguy/atoum: dev-master
This package is auto-updated.
Last update: 2024-08-28 08:42:04 UTC
README
PHP的完整值集合
除了使用PHP提供的原始类型(浮点数、整数、字符串、布尔值、日期时间)之外,你将创建并使用新的对象来表示你业务中的有意义的数量。
这些值(如货币、信用卡号码、邮编、名、姓、日历周期或电话号码)将携带从用户界面到领域模型的有用信息块。
但在开发的早期阶段,你通常会做出关于使用原始类型来表示简单事实的决定...
随着开发的进行,你意识到这些简单项目并不像最初想象的那么简单:电话号码可能最初被表示为一个字符串,但后来你意识到电话号码需要特殊的行为,如格式化、提取区号等。
因此,在很早的时候使用对象来量化你的领域模型,并使用这些值作为你方法参数是非常有趣的。
本套件目前提供以下基础类:
- 字符串
- 整数
- 无符号整数
- 浮点数
- 无符号浮点数
这些类的所有实例都是不可变的,所以如果你尝试设置或取消设置它们的属性,将抛出 logicException
。
要访问底层值,请使用属性 asString
(对于字符串)、asInteger
(对于整数)和 asFloat
(对于浮点数)。
所有这些类都是抽象的,因此你应该扩展它们来量化你的领域。
<?php use estvoyage\value\string; final class phone extends string { function __construct($value) { parent::__construct($value); if (! static::validateFormat($value)) { throw new \domainException('Phone number format is invalid'); } } static function validate($value) { return parent::validate($value) && self::validateFormat($value); } private static function validateFormat($value) { return preg_match('/^\+\d{2} \d(?: \d{2}){4}$/', $value); } } $phone = new phone('+ 33 1 23 45 67 89'); echo $phone->asString; // display '+ 33 1 23 45 67 89' echo $phone->{uniqid()}; // throw a \logicException with message 'Undefined property in phone: …' $phone->{uniqid()} = uniqid(); // throw a \logicException with message 'phone is immutable' $phone->asString = uniqid(); // throw a \logicException with message 'phone is immutable' unset($phone->{uniqid()}); // throw a \logicException with message 'phone is immutable' unset($phone->asString); // throw a \logicException with message 'phone is immutable' $badFormat = new phone('01 23 45 67 89'); // throw a domainException!
请注意,phone
类是最终的,因为它包含一个公开属性,因此扩展它将违反 Liskov 替换原则。
所有这些类都实现了 __toString()
,因此你可以使用它们的实例作为任何与字符串相关的PHP函数的参数。
<?php use estvoyage\value\string; final class phone extends string {} $phone = new phone('+ 33 1 23 45 67 89'); echo substr($phone, 0, 4); // display '+ 33'