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/ 对象

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息