PHP __compare 魔术方法的实现

之前吐槽过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改变

先看对象比较的实现吧,这里假设我们是有__compare这个魔术方法的。当两个对象进行比较时会调用zend_std_compare_objects这个函数,然后让函数检测对象是否注册了__compare,如果有就优先调用,很简单吧。

再下面的就懒得贴过来了,直接贴我博客地址

http://solupro.org/PHP__compare_maigc_method/

转载于:https://my.oschina.net/s01u/blog/264777

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值