За последние 24 часа нас посетили 22534 программиста и 1017 роботов. Сейчас ищут 729 программистов ...

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

Тема в разделе "Прочие вопросы по PHP", создана пользователем artoodetoo, 30 мар 2023.

Метки:
  1. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Век живи — век учись ))
    В документации написано что сравнивать можно объекты одного класса, это логично, и описано поведение операторов "==" и "===". Но не сказано как должны работать неравенства <, >.
    Только в коментарии сказано что мол "надо бы задокументировать это поведение"
    https://www.php.net/manual/en/language.oop5.object-comparison.php#98725

    TLDR;
    По факту я вижу что сравнивать сравнимые объекты очень даже можно. Например популярный тип Carbon имеет специальные методы для сравнения ->greaterThan() или ->gt() но! точно так же работает и привычное сравнение

    PHP:
    1. Carbon::parse('2023-01-10') > Carbon::parse('2023-01-09')
    Если верить коментарию по ссылке выше, то сравнение ведется до первого неравного свойства объекта. Я думаю что на самом деле сравниваются текстовые или сериализованные представления объектов. Если кто-то уже исследовал вопрос или готов потратить время на такое исследование — тому респект и уважуха.
     
  2. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    152
    Симпатии:
    40
    Адрес:
    Барнаул
    https://github.com/php/php-langspec/blob/master/spec/10-expressions.md#relational-operators
    Из спецификации (перевод google):
    При сравнении двух объектов, если какой-либо из типов объектов имеет собственную семантику сравнения, это будет определять результат с приоритетом левого операнда. В противном случае, если объекты относятся к разным типам, результатом сравнения будет FALSE. Если объекты одного типа, свойства объектов сравниваются с использованием сравнения массивов....
     
    artoodetoo нравится это.
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Спасибо!
    Я таки процитирую оригинал:
    "If the objects are of the same type, the properties of the objects are compares using the array comparison described above."

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

    "For arrays having the same numbers of elements, the keys from the left operand are considered one by one, if the next key in the left-hand operand exists in the right-hand operand, the corresponding values are compared. If they are unequal, the array containing the lesser value is considered less-than the other one, and the comparison ends; otherwise, the process is repeated with the next element."

    то есть они реально сравниваются до первого неравного свойства.
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Возвращаясь к сравнению объектов типа Carbon, наверное это просто удача, что операция ">" даёт тот же результат, что и ->greaterThan(). Ведь никто не гарантирует какое будет внутреннее представление свойств. В следующей версии оно может поменяться и тогда результат сравнения может оказаться другим. Даже просто перестановка свойств местами в описании класса может изменить результат сравнения. Лучше пользоваться официальным документированным API для конкретного класса.
    --- Добавлено ---
    В стиле PHP можно было бы определить магический метод, скажем,
    PHP:
    1. static function __spaceship($a, $b) {}
    , который бы возвращал -1, 0, 1 и этого было бы достаточно чтобы перекрывать операции ==, <, >, <=, >=

    Эх, мечты, мечты... :)
     
  5. Aleksandr.B

    Aleksandr.B Новичок

    С нами с:
    2 фев 2023
    Сообщения:
    152
    Симпатии:
    40
    Адрес:
    Барнаул
    Carbon по всей видимости наследуется от DateTime, а DateTime один из тех объектов, который реализует собственную семантику сравнения на уровне движка php.