PHP中是否有像Java中那样__equals方法?

2022-08-30 13:10:03

有没有一种模式或神奇的方法可以在PHP中使用来定义何时比较一个类的两个实例?

例如,在Java中,我可以轻松地覆盖该方法,并创建一种检查和比较两个实例的自定义方法。equals


答案 1

一句话?不。没有神奇的方法。手册中有一个完整的魔术方法列表。__equals

你可以做

$myObject1 == $myObject2

如果它们具有相同的属性和值,并且是同一类的实例,则会认为它们是相等的。

我自己也经常希望这种类型的方法,但我认为更有用的方法是一个方法,它将被调用用于任何比较运算符<,>,==,===等,它已经存在于PHP的内置类中,如PHP内部wiki所示,并且在PHPInternals书中有一个如何实现它的例子:-__compare()

compare_objects

int (*compare)(zval *object1, zval *object2 TSRMLS_DC)

比较两个对象。用于运算符 ==、!=、<、>、⇐ 和 >=。实现应遵循以下规则 - 对于共享相同比较处理程序的任何对象 a、b 和 c:

我用来实现这一点的一种方法是实现一个可比较的接口,例如:

interface Comparable
{
    /**
     * @param Comparable $other
     * 
     * @return Int -1, 0 or 1 Depending on result of comparison
     */
    public function compareTo(Comparable $other);
}

对象比较的详细信息以及与OOP相关的其他所有内容都可以在这里找到,http://www.php.net/manual/en/language.oop5.php

这可以在 PHP 7 中实现

现在有一个可以使用 composer 安装的此实现。https://github.com/Fleshgrinder/php-comparable


答案 2

可悲的是,不是,但你可以很容易地复制一些接近的东西。例如:-

<?php
interface IComparable {
    public function compare(self $subject);
}

class Foo implements IComparable {
    public function compare(self $subject) {
        return $this->__toString() === $subject->__toString();
    }
    public function __toString() {
        return serialize($this);
    }
}

function compare(IComparable $a, IComparable $b) {
    return $a->compare($b);
}

$a = new Foo;
$b = new Foo;

var_dump(compare($a, $b)); //true

$a->name = 'A';
$b->name = 'B';

var_dump(compare($a, $b)); //false

它不是特别优雅,但应该让你上路。

安东尼。


推荐