PHP __compare 魔術方法的實現

以前吐槽過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

再下面的就懶得貼過來了,直接貼我博客地址

http://solupro.org/PHP__compare_maigc_method/ 對象

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息