eloquent / equality
该包已被废弃,不再维护。没有推荐替代包。
PHP 的更好严格比较。
2.1.2
2014-02-11 11:33 UTC
Requires
- php: >=5.3
Requires (Dev)
- icecave/archer: ~1
README
PHP 的更好严格比较。
已弃用
Equality 已弃用。请使用 Parity 代替。
安装和文档
- 作为 Composer 包 eloquent/equality 提供。
- API 文档 可在此处获取。
问题
有时需要比较两个对象以确定它们是否被认为是相等的。
如果使用 ==
运算符,则没有关于相等的严格性。例如,以下代码片段输出 'equal':
$left = new stdClass; $left->foo = 0; $right = new stdClass; $right->foo = null; if ($left == $right) { echo 'equal'; } else { echo 'not equal'; }
相反,如果使用 ===
运算符,除非是相同的 实例,否则对象不相等。以下代码片段输出 'not equal':
$left = new stdClass; $left->foo = 'bar'; $right = new stdClass; $right->foo = 'bar'; if ($left === $right) { echo 'equal'; } else { echo 'not equal'; }
遗憾的是,PHP 没有内置的方法来严格比较对象,而无需它们是相同的实例。这就是 Equality 的用武之地。以下代码片段正确输出 'equal':
use Eloquent\Equality\Comparator; $left = new stdClass; $left->foo = 'bar'; $right = new stdClass; $right->foo = 'bar'; $comparator = new Comparator; if ($comparator->equals($left, $right)) { echo 'equal'; } else { echo 'not equal'; }
用法
Equality 非常简单易用。只需实例化一个 Comparator
并使用其 equals()
方法。
use Eloquent\Equality\Comparator; $comparator = new Comparator; if ($comparator->equals($left, $right)) { // equal } else { // not equal }
Equality 可以与任何 PHP 数据类型一起工作,而不仅仅是对象。
自定义相等逻辑
在某些情况下,可能希望自定义确定相等性的方式。可以使用接口 EqualityComparable
为任何类提供自定义的相等实现。
use Eloquent\Equality\Comparator; use Eloquent\Equality\EqualityComparable; class Foo implements EqualityComparable { /** * @param mixed $value * @param Comparator $comparator * * @return boolean */ public function isEqualTo($value, Comparator $comparator) { // custom logic... } }
当 Equality 遇到实现 EqualityComparable
的对象时,它将返回 isEqualTo()
方法的结果,而不是使用默认的相等逻辑。比较器本身将被作为第二个参数传递。
如何使用 Equality?
Equality 使用 反射 递归遍历传递给它的值,并确保它们是深度和严格相等的。
此外,它还实现了特殊保护以避免无限递归问题,例如包含自身的对象或包含正在比较的对象的对象。