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正如我在回答中所说,这是一种解决方法,您仍然可以序列化对象,即使对象中有闭包!只需简单地移除它们。但我认为目前还没有一种方法可以将两个对象与其中的闭包进行比较