#php #arrays #usort
#php #массивы #usort
Вопрос:
У меня есть этот класс:
class ResultSet
implements ArrayAccess, Countable, Iterator {
/// Rest of implementation ...
}
Я столкнулся с проблемой, используя usort () и передавая свой объект в качестве первого параметра. usort () ожидает массив вместо объекта, но, учитывая мою реализацию ArrayAccess
интерфейса, я не знаю, что еще ему может понадобиться.
Точная ошибка, возвращаемая php, такова: Warning: usort() expects parameter 1 to be array, object given
.
Комментарии:
1. Даже
ArrayObject
страдающие от этого, я бы сказал, что это либо ошибка, либо, по крайней мере, нежелательная устаревшая проблема…
Ответ №1:
Откуда usort
знать, как вы реализовали ArrayAccess
? Нет определенного места, где хранятся значения — в этой гибкости заключается весь смысл интерфейса.
Если вы храните элементы в массиве, который является закрытым элементом объекта, вы могли бы выполнить usort
операцию через прокси. Например:
public function usort($callback) {
usort($this->container, $callback);
}
Комментарии:
1. Я бы предположил, что usort () мог бы внутренне вызвать class_implements() (или что-то в этом роде) и выяснить, может ли то, что вы передаете, вести себя как массив. Я также не могу использовать прокси, поскольку мой внутренний массив содержит всевозможные объекты, но я могу придумать что-нибудь в этом роде. Спасибо!
Ответ №2:
Если мне не изменяет память, на странице ArrayAccess или в одном из комментариев к ней есть большой предупреждающий знак (на самом деле, вероятно, последнее). В основном это говорит о чем-то в порядке: интерфейс несколько бесполезен, потому что функции массива PHP не распознают ни один из его элементов как массивы.