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

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

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

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

Ответ 4

Я тоже был смущен, чтобы не найти классов классов Collection в PHP. Массивы имеют несколько реальных недостатков в моем опыте.

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

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

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

Ответ 5

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

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

Ответ 7

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

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

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;
   }
}