mle86 / value
不可变单值包装类的基类
Requires
- php: >=7.0.0
- ext-json: *
Requires (Dev)
README
这个PHP库提供了一个简单的不可变值对象的基类。这些对象封装了精确的一个值,不能以任何方式进行更改,没有额外的状态,并在构造函数中携带一些验证逻辑。
它遵循MIT许可协议。
简单用例
class OddNumber extends \mle86\Value\AbstractValue { // The base class requires this boolean test method: public static function isValid($input): bool { return (is_int($input) && ($input % 2) === 1); } // Nothing else is needed. } function myFunction(OddNumber $oddArgument) { /* No further validation of $oddArgument is necessary in this function, * it's guaranteed to contain an odd number. */ print "Got an odd number here: " . $oddArgument->value(); } $odd1 = new OddNumber(61); // works as expected, $odd1->value() will return 61 $odd2 = new OddNumber(40); // throws an InvalidArgumentException $odd3 = new OddNumber("string"); // throws an InvalidArgumentException $odd4 = new OddNumber(null); // throws an InvalidArgumentException $odd5 = OddNumber::optional(33); // works as expected, $odd5->value() will return 33 $nonodd = OddNumber::optional(null); // $nonodd is now null $odd6 = OddNumber::optional(40); // throws an InvalidArgumentException
安装
通过Composer: composer require mle86/value
或者将以下内容添加到项目的 composer.json
文件中
"require": { "mle86/value": "^2" }
最低PHP版本
PHP 7.0
类和接口
- Value (接口)
- AbstractValue (抽象类)
- AbstractSerializableValue (抽象类)
- InvalidArgumentException (异常)
- NotImplementedException (异常)
Value
此接口指定所有Value类都应该具有
- 一个接受精确一个参数的构造函数,
- 一个无参数的value()方法。
AbstractValue
此不可变类为每个实例封装一个单一值。构造函数对输入值执行有效性检查。因此,每个类实例封装的值都可以被认为是有效的。
有效性检查位于所有子类都必须实现的isValid类方法中。这是一个类方法,以便在不将外部值封装在实例中时对其进行有效性检查。
-
public function __construct($rawValue)
构造函数使用isValid类方法测试其输入参数。有效值存储在新的实例中,无效值会抛出InvalidArgumentException。同一类的其他实例始终被认为是有效的(重新封装)。
-
public static function optional($rawValue): ?static
与默认构造函数相同,但也接受null值(将返回未更改的值)。
-
abstract public static function isValid($testValue): bool
检查原始值的有效性。如果它返回true,则可以使用该值创建一个新对象。在所有子类中实现此功能!
-
final public function value(): mixed
返回对象封装的初始值。
-
final public function equals($testValue): bool
相等性测试。此方法对其他实例或原始值执行相等性检查。只有在它们是同一子类的实例并且携带相同的value()时,对象才被认为是相等的。所有其他值只有在它们与当前对象的value()完全相同(===)时才被认为是相等的。
-
final public static function wrap(&$value)
将值(按引用)替换为封装该值的实例。当然,如果输入值未通过子类的isValid检查,则调用将失败并抛出InvalidArgumentException。如果值已经是实例,则不会替换。
-
final public static function wrapOptional(&$value)
与wrap()类似,但不会更改null值。
-
final public static function wrapArray(array &$array): array
将数组中的所有值替换为实例。只有当数组的所有值都有效时,数组才会被修改(按引用)。将保留数组键。
-
final public static function wrapOptionalsArray(array &$array): array
将用实例替换数组中所有非
null
的值。只有当数组中的所有值都是有效(或null
)时,数组才会被改变(按引用)。将保留数组键。
AbstractSerializableValue
这是AbstractValue
的扩展,为Value对象提供了易于序列化的功能。它实现了JsonSerializable接口。
始终支持通过serialize/unserialize的标准PHP序列化。该类包含一个额外的__wakeup()
实现,以确保反序列化的实例始终包含一个有效的值。
-
public function __toString(): string
返回包装的值,类似于
value()
,但是带有显式的string
类型转换。这允许Value对象的字符串连接。 -
public function jsonSerialize(): mixed
返回包装的值,类似于
value()
。这使json_encode()能够编码对象。
InvalidArgumentException
PHP的InvalidArgumentException
的空扩展。