1

では、 を含むクラスをどのように比較しますClosureか? できないようです。

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

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

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

1 に答える 1

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;
    }

}

したがって、 with を使用serialize()md5()て、次のようにオブジェクトを比較できます。

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

出力:

bool(true)
于 2015-04-09T16:08:01.223 に答える