PHP中是否有像Java中那样__equals方法?
有没有一种模式或神奇的方法可以在PHP中使用来定义何时比较一个类的两个实例?
例如,在Java中,我可以轻松地覆盖该方法,并创建一种检查和比较两个实例的自定义方法。equals
有没有一种模式或神奇的方法可以在PHP中使用来定义何时比较一个类的两个实例?
例如,在Java中,我可以轻松地覆盖该方法,并创建一种检查和比较两个实例的自定义方法。equals
一句话?不。没有神奇的方法。手册中有一个完整的魔术方法列表。__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。
现在有一个可以使用 composer 安装的此实现。https://github.com/Fleshgrinder/php-comparable
可悲的是,不是,但你可以很容易地复制一些接近的东西。例如:-
<?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
它不是特别优雅,但应该让你上路。
安东尼。