mle86/value

不可变单值包装类的基类

v2.2.2 2021-12-21 08:58 UTC

This package is auto-updated.

Last update: 2024-09-21 14:38:04 UTC


README

Build Status Coverage Status Latest Stable Version PHP 7.0 License

这个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

类和接口

  1. Value (接口)
  2. AbstractValue (抽象类)
  3. AbstractSerializableValue (抽象类)
  4. InvalidArgumentException (异常)
  5. 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的空扩展。