PHP 不可变对象行为

1.2.2 2017-12-04 16:02 UTC

This package is auto-updated.

Last update: 2024-09-20 23:57:53 UTC


README

License Latest Stable Version Latest Unstable Version Total Downloads Build Status Scrutinizer Code Quality Code Coverage

此包包含一些可重用的类、接口和特性,旨在为创建不可变和可变对象提供基础。

此包源于对创建美观的“样板”代码的热爱,这些代码可以在任何数量的简单和复杂对象中重复使用。此包中使用的多数想法都围绕创建最基本的PHP对象——一个不可变且不改变的对象。问题是,PHP有很多“魔术方法”,虽然它们对于方法覆盖很有用,但并不利于确保不可变状态。此包旨在解决这个问题,并提供一些基类,以便您可以构建易于使用的不可变类。

要求

  • PHP >= 7.1.0

安装

composer require simondeeley/type

使用方法

创建自己的不可变对象

use simondeeley\ImmutableObject;

class Foo extends ImmutableObject
{
    //...
}

这是创建不可变对象的起点。在幕后,ImmutableObject 的基类设置了一些合理的默认值,包括覆盖PHP的魔术方法 __set__unset,以防止隐式设置(或取消设置)类属性。

在您的具体类中还需要实现一个方法,即 getType。此方法是从接口 simondeeley\Type\Type 继承的,该接口定义了一个静态方法 getType,该方法应返回一个描述对象类型的字符串。

这个方法可能看起来有些奇怪,但当定义一大堆可能具有相同基类但需要区分身份的对象时,它非常有用。

在上面的示例中,您可以这样实现接口

public static function getType(): string
{
    return 'foo';
}

进一步学习

除了 ImmutableObject,此包还提供了一个基类,用于需要像数组一样行为的对象,实现了PHP内置的 ArrayAccess。这种行为在 ImmutableArrayTypeObject 中提供,它扩展了 ImmutableObject 并包括 offsetSetoffsetUnset 的默认实现。

这些类都使用一些特质提供上述默认实现。您可以探索这些特质以及代码中的接口,代码已完全文档化和注释。

测试相等性

通常需要检查两个对象是否相等。此包提供了一个 TypeEquality 接口,该接口描述了一个方法,即 equals

public bool equals ( Type $type [, int $flags ] )

此方法接受一个类型为 simondeeley\Type\Type 的对象作为参数。此接口是所有其他“类型”构建的基础接口。此方法还可选地接受一个额外的参数——一个位运算整数标志。这可以用来强制执行或忽略某些约束。目前支持两个标志

  • TypeEquality::IGNORE_OBJECT_TYPE

    设置此标志以忽略由 Type::getType 设置的对象类型。

  • TypeEquality::IGNORE_OBJECT_IDENTITY

    设置此标志以忽略检查对象是否指向相同的PHP引用,例如通过检查调用spl_object_hash获得的值。

可以使用管道'|'运算符组合位运算符,例如 $foo->equals($bar, TypeEquality::IGNORE_OBJECT_TYPE | TypeEquality::IGNORE_OBJECT_IDENTITY)

在实现此方法时,您可以选择是否使用位标志,但它们应出现在方法签名中。然后,方法体应执行必要的操作以比较两个对象以确定它们是否相等。一个示例可以在simondeeley\Tuple包中找到,该包使用此包构建一个不可变的元组对象,可以与另一个元组比较相等性。