Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何比较包含“Closure”的类?_Php_Php Closures - Fatal编程技术网

Php 如何比较包含“Closure”的类?

Php 如何比较包含“Closure”的类?,php,php-closures,Php,Php Closures,那么,如何比较包含闭包的类呢?看来你不能 class a { protected $whatever; function __construct() { $this->whatever = function() {}; } } $b = new a(); $c = new a(); var_dump( $b == $c ); //false 当然,您不能直接关闭,但您可以做一个变通方法,因为serialize()在序列化对象时调用,

那么,如何比较包含
闭包的类呢?看来你不能

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

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

var_dump( $b == $c );   //false
当然,您不能直接关闭,但您可以做一个变通方法,因为
serialize()
在序列化对象时调用,所以它为对象提供了清理对象的选项!这就是我们在这里所做的:

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)

那么它是基于班级的吗?所以如果你做了
$c->var=1
它们是否仍然是
=
?最简单的方法可能是自定义比较方法:
$b->isEqual($c)
,在这种方法中,您比较所有对相等重要的内容,忽略不可比较的值。是的,它适用于这种特定情况。但如果你重新定义,他们仍然是平等的。请参阅问题更新。@user2398964正如我在回答中所说,这是一种解决方法,您仍然可以序列化对象,即使对象中有闭包!只需简单地移除它们。但我认为目前还没有一种方法可以将两个对象与其中的闭包进行比较