Как in_array проверяет, находится ли объект в массиве объектов?

Делает ли in_array() сравнение объектов там, где он проверяет, что все атрибуты одинаковы? Что, если $obj1 === $obj2 , будет ли он вместо сравнения с указателем вместо этого?

Я использую ORM, поэтому я бы предпочел бы $obj1->getId() тестирование объектов, если $obj1->getId() уже находится в массиве, если он сравнивает объекты. Если нет, in_array гораздо более кратким.

in_array() не выполняет сравнения ( $a == $b ), если вы не передадите TRUE третьему аргументу, и в этом случае он выполняет строгие сравнения ( $a === $b ).

Семантически in_array($obj, $arr) идентичен этому:

 foreach ($arr as &$member) { if ($member == $obj) { return TRUE; } } return FALSE; 

… и in_array($obj, $arr, TRUE) идентичен этому:

 foreach ($arr as &$member) { if ($member === $obj) { return TRUE; } } return FALSE; 

… и процитировать руководство по тому, что это на самом деле проверяет:

При использовании оператора сравнения (==) переменные объекта сравниваются простым образом, а именно: два экземпляра объекта равны, если они имеют одинаковые атрибуты и значения и являются экземплярами одного и того же класса.

С другой стороны, при использовании оператора идентификации (===) переменные объекта идентичны тогда и только тогда, когда они относятся к одному и тому же экземпляру того же класса.

Объекты всегда ссылаются на PHP 5+ и могут быть скопированы (таким образом, создаются новые объекты) с помощью clone .

Это означает, что вы должны иметь возможность использовать in_array() .