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