PHP SPL, стоит ли использовать или лучше использовать необработанные функции массива?

Я изучаю стандартную библиотеку PHP (SPL). Раньше я использовал только массивы и только сейчас обнаружил, что в PHP так много стандартных классов. Но в инструкции нет ни слова о том, рекомендуется его использовать или нет. Например, они явно рекомендуют использовать конструкцию foreach для перебора массивов, потому что это быстрее. А что с этой библиотекой? Если мне нужно сохранить некоторые данные в объекте, должен ли я использовать какой-то конкретный класс SPL для моей ситуации или в любом случае лучше использовать стандартные массивы?


person Green    schedule 07.07.2012    source источник
comment
Если вы храните данные в объекте, вы можете перебирать объект, реализуя ArrayAccess или ArrayIterator, но базовые данные по-прежнему хранятся в простом старом PHP-массиве. Обычные массивы хороши, если вы хотите хранить данные в объекте, реализуйте один из Итераторы на ваше усмотрение.   -  person drew010    schedule 08.07.2012


Ответы (1)


В вашем вопросе многое. Следует ли вам использовать структуры данных SPL? Это зависит.

Массив PHP может действовать как карта, связанный список или массив. Очень редко вам действительно нужен один тип данных, который действует как все эти вещи одновременно, поэтому сфокусированный характер типов данных SPL не так уж ограничивает. Фактически, большинство "аутсайдеров" (и некоторые "инсайдеры") сочли бы массив PHP пародией.

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

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

Это сказало:

  • Если вы оказались в ситуации, когда вы используете массив как связанный список (вставка/удаление посередине), то попробуйте один из двусвязных списков SPL.

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

  • Если вам нужна карта с объектами в качестве ключа, используйте SplObjectStorage (поскольку массив PHP не работает с ключами объектов).

  • Если вы хотите, чтобы данные были упорядочены в массиве, попробуйте одну из куч.

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

person Matthew    schedule 08.07.2012
comment
+1, но я скажу от себя, что я всегда склоняюсь к нативным массивам php просто потому, что они имеют превосходную языковую интеграцию и работают со всеми замечательными функциями массива php. spl часто кажется несовместимым с php. - person goat; 15.07.2012
comment
Я согласен, что эти структуры данных имеют тенденцию торчать как больной палец. Обычно я использую их только при обработке большого количества данных (и даже тогда PHP не является моим первым языком) или когда мне нужно передать массивы по ссылке. - person Matthew; 15.07.2012