以前吐槽過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
再下面的就懶得貼過來了,直接貼我博客地址