Java-подобные коллекции в PHP

Я изучаю PHP5 (последний раз, когда я проверил PHP в PHP4 дней), и я рад видеть, что PHP5 OO больше похож на Java, чем на PHP4, но все еще есть проблема, которая заставляет меня чувствовать себя совершенно неудобной из-за моей Java background: ARRAYS.

Я читаю «Proffesional PHP6» (Wrox), и он показывает свою собственную реализацию Collection. Я нашел другие кланы, такие как http://aheimlich.dreamhosters.com/generic-collections/Collection.phps на основе SPL. Я также обнаружил, что есть какая-то коллекция в SPL (ArrayObject)

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

Итак, разве это не хорошая идея с использованием Collections в PHP, как люди используют ArrayList вместо базовых массивов в Java? В конце концов, массивы php не очень похожи на массивы java.

Коллекции в Java имеют большой смысл, поскольку это строго типизированный язык. Имеет смысл иметь коллекцию «Автомобили» и еще одну «Мотоциклы».

Однако в PHP, из-за динамически типизированной природы, довольно часто жертвовать формальностью Коллекций. Массивов достаточно для использования в качестве универсальных контейнеров различных типов объектов (автомобили, мотоциклы и т. Д.). Кроме того, дополнительное преимущество исходит из того факта, что массивы могут быть мутированы очень легко (что иногда может быть большим недостатком, когда правильная проверка ошибок отсутствует).

Я пришел из фона Java, и я обнаружил, что использование шаблона проектирования Collections в PHP не сильно выигрывает в преимуществах (без многопоточности, без оптимизации распределения памяти, без итераторов и т. Д.).

Если вы ищете какие-либо из этих преимуществ, вероятно, лучше построить класс-оболочку вокруг массива, реализуя каждую функцию (итераторы и т. Д.) A la carte.

Я очень профессионально собираю объекты в PHP, их можно использовать для добавления безопасности типов, простоты использования функций поиска, сортировки и манипулирования и представления правильного подхода OO, а не использования массивов и множества полезных, но процедурных функций, которые работают они имеют разные шаблоны по всему источнику.

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

Но ultimatley, они все массивы внутри!

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

Массивы PHP являются ассоциативными … Они намного мощнее, чем массивы Java, и включают в себя большую часть функций List <> и Map <>.

Что вы подразумеваете под «хорошей идеей»? Они разные инструменты, используя один язык в том, как вы использовали другой, обычно приводят к разочарованию.

Я тоже был несколько встревожен тем, что не нашел классов типа Collection в PHP. У моего массива есть несколько реальных недостатков.

Во-первых, количество функций, доступных для их управления, несколько ограничено. Например, мне нужно иметь возможность произвольно вставлять и удалять элементы в / из коллекции в заданной позиции индекса. Выполнение этого со встроенными языковыми функциями для массивов на PHP в лучшем случае болезненно.

Во-вторых, как своего рода ответвление первой точки, написание чистого, удобочитаемого кода, который манипулирует массивами на любом уровне сложности, помимо простых файлов push / pop и iterator, в лучшем случае сложнее. Я часто обнаруживаю, что мне нужно использовать один массив для индексирования и отслеживать другой массив в приложениях, интенсивно использующих данные, которые я создаю.

Я предпочитаю работать в рамках (мой личный выбор – NOLOH ). Там у меня есть класс Collection, называемый ArrayList, который имеет такие функции, как Add, Insert, RemoveAt, RemoveRange и Toggle. Я полагаю, что другие PHP-фреймворки также решают эту проблему.

Хорошая реализация коллекции в php предоставляется Varien Lib, эта библиотека является частью кода Magento с лицензией OSL. (подробнее об использовании лицензии Magento и повторного использования кода здесь .

Невозможно найти исходный код для библиотеки, поэтому лучше всего загрузить magento, а затем посмотреть в / lib / Varien /

Yii реализует полный набор Java-коллекций

http://www.yiiframework.com/doc/api/1.1/CList

Я иногда использую эту очень простую реализацию, чтобы дать мне грубую и готовую коллекцию.

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

class SomeObjectCollection { /** * @var SomeObject[] */ private $collection = array(); /** * @param SomeObject $object1 * @param SomeObject $_ [optional] */ function __construct(SomeObject $object1 = null, SomeObject $_ = null) { foreach (func_get_args() as $index => $arg) { if(! $arg instanceof SomeObject) throw new \RuntimeException('All arguments must be of type SomeObject'); $this->collection[] = $arg; } } /** * @return SomeObject[] */ public function getAll() { return $this->collection; } }