simondeeley / type
PHP 不可变对象行为
Requires
- php: ~7.1
README
此包包含一些可重用的类、接口和特性,旨在为创建不可变和可变对象提供基础。
此包源于对创建美观的“样板”代码的热爱,这些代码可以在任何数量的简单和复杂对象中重复使用。此包中使用的多数想法都围绕创建最基本的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
并包括 offsetSet
和 offsetUnset
的默认实现。
这些类都使用一些特质提供上述默认实现。您可以探索这些特质以及代码中的接口,代码已完全文档化和注释。
测试相等性
通常需要检查两个对象是否相等。此包提供了一个 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包中找到,该包使用此包构建一个不可变的元组对象,可以与另一个元组比较相等性。