之前吐槽过PHP为什么没__compare
魔术方法《PHP __compare?》,可能开发组觉得没有必要吧,毕竟对象默认的比较一般情况已经够用了。 于是乎怀着no zuo no die心情尝试去实现一下,发现难度比预想要小。但由于拖延症的原因这篇文拖到现在才写,还有一方面就是修改的地方比较多和杂乱。
先看看效果吧!
<?php
//默认情况
class Foo
{
private $v = [];
public function __construct(array $v) {
$this->v = $v;
}
}
$o1 = new Foo([1, 2, 3]);
$o2 = new Foo([2, 1, 4]);
var_dump($o1 > $o2);
/* output */
bool(false)
//添加 __compare
class Foo
{
private $v = [];
public function __construct(array $v) {
$this->v = $v;
}
public function __compare($o) {
return $this->v[1] > $o->v[1];
}
}
$o1 = new Foo([1, 2, 3]);
$o2 = new Foo([2, 1, 4]);
var_dump($o1 > $o2);
/* output */
bool(true)
可以看出,$o1, $o2的比较行为已经被__compare
改变