では、 を含むクラスをどのように比較しますClosure
か? できないようです。
class a {
protected $whatever;
function __construct() {
$this->whatever = function() {};
}
}
$b = new a();
$c = new a();
var_dump( $b == $c ); //false
では、 を含むクラスをどのように比較しますClosure
か? できないようです。
class a {
protected $whatever;
function __construct() {
$this->whatever = function() {};
}
}
$b = new a();
$c = new a();
var_dump( $b == $c ); //false
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)