Выполнение асорта на коллекции объектов

Хотите знать, если кто-нибудь может помочь пролить свет на то, что делает 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?
  • Здесь что-то еще играет?

Какие-нибудь мысли?

0 ответов

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