Интересно, может ли кто-нибудь помочь пролить свет на то, что 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 и сортировкой по хешам
Есть предположения?
Я думал, что модульные тесты и тестовые данные являются ключевыми для объяснения этой проблемы - без них у меня просто вызов asort с массивом объектов с очень небольшим контекстом? Однако я вижу аргумент о мертвой ссылке - я обновлю сообщение минимальным фрагментом и некоторым контекстом.
Кажется, у вас есть очень хорошо продуманный вопрос о запутанности PHP, но весь модульный тест, вероятно, является излишним и может вызвать у читателей недовольство. Вы, конечно, можете включить полный модульный тест в качестве ссылки где-нибудь, но обязательно попробуйте дать MCVE.
Комментарий для начала: php.net/manual/ru/language.oop5.object-comparison.php#98725
@u_mulder Я как раз хотел упомянуть, что это похоже на недокументированное поведение. Таким образом, на него, вероятно, не стоит полагаться, и в него могут быть внесены изменения без предварительного уведомления.
@MonkeyZeus Полагаю, поэтому это комментарий. Но это может быть объяснением того, что творится под капотом.
@u_mulder Я не опровергаю, что это хорошее объяснение и, вероятно, заслуживает ответа, если вы можете немного его расширить. Я думаю, что если вы можете показать эквивалентную реализацию usort()asort(), то это было бы весьма полезно. Я лично все еще пытаюсь разобраться в ситуации.
Дальше иду - дурак)






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