in PHP

Сравнение объектов в PHP

Как известно, в PHP возможно применение двух операторов сравнения: «==» – loose equivalence и «===» – strict identity. Последний самый простой для понимания и не требует особых объяснений – два объекта строго равны только если сравнивается один и тот же объект, со всеми остальными объектами даже того же класса и с теми же значениями всегда будет false.

Важно отметить, что во встроенных объектах PHP может быть реализован свой алгоритм сравнения, и данная статья говорит только о несистемных объектах.

Равенство объектов

Оператор сравнения «==» применяется только для объектов одного и того же класса (в противном случае результатом будет false), и сравнивает все свойства класса, нестрого, в случае же если в свойствах класса содержатся объекты то они также будут сравнены в соответствие с общими правилами, включая и их свойства, данный процесс рекурсивен, по этому будьте осторожны при сравнении двух объектов содержащих ссылки на объекты самих себя, иначе вы рискуете напороться на фатальную ошибку: Nesting level too deep – recursive dependency.

Рассмотрим два примера

Таким образом мы видим, что строгое сравнение вернуло false, несмотря на “одинаковость” объектов.

Сравнение больше/меньше

При сравнении > или < выражение вернет true если первое свойство будет соответственно меньше либо больше второго с тем же именем (свойства проверяются в порядке их определения в классе), остальные же свойства PHP попросту проигнорирует. В случае равенства первых свойств сравнение продолжится до первого «разногласия».

Теперь покажем на примере, что сравниваются “первые попавшиеся” свойства

Как мы видим PHP проигнорировал свойства field2 и field3, т.к. проверяет свойства последовательно, в порядке их определения.

Интересно заметить, что свойства в значениях которых находятся объекты PHP начинает проверять рекурсивно на соответствующий оператор сравнения.. как в случае с оператором равенства, чуть чуть изменим пример выше

И увидим, что объект $a у нас окажется больше! Важно, что если в первом поле объекта окажутся объекты разного типа, то сравнение вернет false.


Полезные ссылки

  1. Comparing Objects
  2. Comparison Operators
  3. Type Comparison Tables

Leave a Reply

  • Related Content by Tag