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/
Ответ 6
Yii имеет реализацию полного набора java как коллекции
http://www.yiiframework.com/doc/api/1.1/CList
Ответ 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;
}
}