Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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;

... и процитировать manual о том, что это действительно проверяет:

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

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

Ответ 2

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

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