Выполнение asort для коллекции объектов

Интересно, может ли кто-нибудь помочь пролить свет на то, что PHP делает под капотом при выполнении asort над коллекцией объектов.

Возьмите следующий фрагмент:

class NameValuePair
{
    private $name;
    private $value;

    public function __construct($name, $value)
    {
         $this->name = $name;
         $this->value = $value;
    }

    public function getName() { return $this->name; }
    public function getValue() { return $this->value; }
}

$nameValuePairs = [
    new NameValuePair('f', 'f'),
    new NameValuePair('b', 'b'),
    new NameValuePair('z', 'z'),
    new NameValuePair('s', 's')
];

asort($nameValuePairs);

Asort правильно сортирует массив по свойству $name экземпляров NameValuePair - результирующий массив содержит объекты в порядке bfsz

Я реализовал два модульных теста - я не ожидал, что asort правильно отсортирует коллекцию, и я всегда буду использовать usort для сортировки массива объектов.

Пожалуйста, просмотрите эту суть для полного контекста и модульных тестов: https://gist.github.com/mgldev/91386cc6e3d65fc239de60dc1bc46114

Общие размышления

  • Невозможно найти в Интернете документацию о том, как PHP обрабатывает объекты в массиве при выполнении asort

  • Можно было бы подумать, что поведение по умолчанию будет чем-то вроде spl_object_hash и сортировкой по хешам

  • Отображается для сортировки с использованием свойства $ name экземпляра NameValuePair, а не значения $
  • Делает ли PHP что-то вроде get_object_vars (), чтобы получить объект в виде массива, а затем выполнить сортировку по нему? get_object_vars вернет пустой массив частных свойств, хотя
  • Как PHP переходит к атрибуту $ name? Почему выбирается атрибут $ name?
  • Здесь что-то еще играет?

Есть предположения?

Пожалуйста, подумайте о добавлении минимального кода, необходимого для воспроизведения результата, вызывающего вашу путаницу. Внешние ссылки обычно не одобряются, потому что они могут перестать существовать для будущих читателей.

MonkeyZeus 24.05.2018 18:07

Я думал, что модульные тесты и тестовые данные являются ключевыми для объяснения этой проблемы - без них у меня просто вызов asort с массивом объектов с очень небольшим контекстом? Однако я вижу аргумент о мертвой ссылке - я обновлю сообщение минимальным фрагментом и некоторым контекстом.

mgldev 24.05.2018 18:11

Кажется, у вас есть очень хорошо продуманный вопрос о запутанности PHP, но весь модульный тест, вероятно, является излишним и может вызвать у читателей недовольство. Вы, конечно, можете включить полный модульный тест в качестве ссылки где-нибудь, но обязательно попробуйте дать MCVE.

MonkeyZeus 24.05.2018 18:17

Комментарий для начала: php.net/manual/ru/language.oop5.object-comparison.php#98725

u_mulder 24.05.2018 18:22

@u_mulder Я как раз хотел упомянуть, что это похоже на недокументированное поведение. Таким образом, на него, вероятно, не стоит полагаться, и в него могут быть внесены изменения без предварительного уведомления.

MonkeyZeus 24.05.2018 18:24

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

u_mulder 24.05.2018 18:29

@u_mulder Я не опровергаю, что это хорошее объяснение и, вероятно, заслуживает ответа, если вы можете немного его расширить. Я думаю, что если вы можете показать эквивалентную реализацию usort()asort(), то это было бы весьма полезно. Я лично все еще пытаюсь разобраться в ситуации.

MonkeyZeus 24.05.2018 18:33

Дальше иду - дурак)

u_mulder 24.05.2018 18:36
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
8
28
0

Другие вопросы по теме