estvoyage/value

一组完整值,用于避免使用原生PHP类型,更多信息请见 http://c2.com/cgi/wiki?ValueObject

dev-master 2015-04-06 18:42 UTC

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'