【问题标题】:How do you compare classes that contain `Closure`?您如何比较包含“闭包”的类?
【发布时间】:2015-06-15 02:00:21
【问题描述】:

那么,您如何比较包含 Closure 的类?看来你不能。

class a {
    protected $whatever;
    function __construct() {    
        $this->whatever = function() {};
    }
}

$b = new a();
$c = new a();

var_dump( $b == $c );   //false

【问题讨论】:

  • 那么是基于类吗?所以,如果你做了$c->var = 1;,他们还应该是==吗?
  • 最简单的可能是自定义比较方法:$b->isEqual($c),您可以在其中比较所有对相等性重要的内容并忽略不可比较的值。

标签: php php-closures


【解决方案1】:

好吧,你不能直接关闭serialize(),但你可以做一个解决方法,因为serialize() 在序列化对象时会调用__sleep(),所以它为对象提供了清理对象的选项!这就是我们在这里所做的:

class a {

    protected $whatever;

    function __construct() {    
        $this->whatever = function() {};
    }

    public function __sleep() {
        $r = [];
        foreach ($this as $k => $v){
            if (!is_array($v) && !is_string($v) && is_callable($v))
                continue;
            $r[] = $k;
        }
        return $r;
    }

}

所以现在您可以使用serialize()md5() 来比较您的对象,如下所示:

var_dump(md5(serialize($b)) === md5(serialize($c))); 

输出:

bool(true)

【讨论】:

  • 是的,它适用于这种特定情况。但如果你重新定义任何东西,它们仍然是平等的。查看问题更新。
  • @user2398964 正如我在回答中所说,这是一种解决方法,即使对象中有闭包,您仍然可以序列化它!通过简单地删除它们。但我认为目前没有一种方法可以将 2 个对象与其中的闭包进行比较
猜你喜欢
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2017-01-03
  • 2015-11-28
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多