2015-04-09 3 views
1

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

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

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

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

Так он основывается на класс? Итак, если вы делали '$ c-> var = 1;' они должны быть '==' или нет? – AbraCadaver

+0

Простейшим может быть пользовательский метод сравнения: '$ b-> isEqual ($ c)', в котором вы сравниваете все, что имеет значение для равенства, и игнорируете несравнимые значения. – deceze

ответ

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) 
+0

Да, это будет работать для этого конкретного случая. Но если вы переопределите все, что бы они ни были равны. См. Обновление вопроса. – user2398964

+0

@ user2398964 Как я уже сказал в ответ, обходным путем вы все еще можете сериализовать объект, даже если в нем есть закрытие! Просто удалив их. Но я не думаю, что в настоящее время существует способ сравнения двух объектов с закрытием в нем – Rizier123

Смежные вопросы