eloquent/equality

该包已被废弃,不再维护。没有推荐替代包。

PHP 的更好严格比较。

2.1.2 2014-02-11 11:33 UTC

This package is auto-updated.

Last update: 2020-02-06 04:44:56 UTC


README

PHP 的更好严格比较。

The most recent stable version is 2.1.2 Current build status image Current coverage status image

已弃用

Equality 已弃用。请使用 Parity 代替。

安装和文档

问题

有时需要比较两个对象以确定它们是否被认为是相等的。

如果使用 == 运算符,则没有关于相等的严格性。例如,以下代码片段输出 '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 使用 反射 递归遍历传递给它的值,并确保它们是深度和严格相等的。

此外,它还实现了特殊保护以避免无限递归问题,例如包含自身的对象或包含正在比较的对象的对象。