Как вы сравниваете классы, которые содержат `Closure`?

Итак, как вы сравниваете классы, которые содержат Closure ? Похоже, вы не можете.

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

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

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

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)
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]