以前吐槽过PHP为何没__compare魔术方法《PHP __compare?》,可能开发组以为没有必要吧,毕竟对象默认的比较通常状况已经够用了。 因而乎怀着no zuo no die心情尝试去实现一下,发现难度比预想要小。但因为拖延症的缘由这篇文拖到如今才写,还有一方面就是修改的地方比较多和杂乱。 php
先看看效果吧! 函数
<?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改变 this
先看对象比较的实现吧,这里假设咱们是有__compare这个魔术方法的。当两个对象进行比较时会调用zend_std_compare_objects这个函数,而后让函数检测对象是否注册了__compare,若是有就优先调用,很简单吧。 code
再下面的就懒得贴过来了,直接贴我博客地址