← Назад к вопросам

Есть ли списочные типы в PHP?

1.7 Middle🔥 111 комментариев
#PHP Core#Алгоритмы и структуры данных

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Списочные типы в PHP: массивы, генераторы и коллекции

Краткий ответ: В отличие от строго типизированных языков (Python, Java), в PHP нет специального типа "список" как отдельной языковой конструкции. Однако его роль с лихвой выполняют массивы (array), которые являются основным и универсальным списковым типом. Начиная с PHP 7.1, добавлена поддержка псевдотипа iterable, а также существуют объекты-итераторы, генераторы и библиотеки коллекций.

1. Основной списковый тип: массивы (array)

Массивы в PHP — это гетерогенные, упорядоченные хэш-таблицы, которые могут использоваться как списки (с числовыми индексами), так и как ассоциативные массивы (с строковыми ключами).

// Список (индексированный массив)
$list = [10, 20, 30];
$list[] = 40; // Добавление элемента в конец

// Ассоциативный массив
$assoc = ['name' => 'Иван', 'age' => 30];

// Гетерогенность
$mixed = [1, 'текст', true, new stdClass()];

Ключевые особенности:

  • Динамический размер (не требует предварительного объявления длины)
  • Поддерживают любые типы данных в качестве значений
  • Автоматическая нумерация при добавлении элементов
  • Встроенные функции для работы: count(), array_map(), array_filter(), array_reduce()

2. Итерируемые структуры: iterable и генераторы

С PHP 7.1 появился псевдотип iterable, который объединяет массивы и объекты, реализующие интерфейс Traversable.

function processItems(iterable $items): void {
    foreach ($items as $item) {
        echo $item . PHP_EOL;
    }
}

// Можно передать массив
processItems([1, 2, 3]);

// Или генератор
function generateNumbers(): Generator {
    for ($i = 0; $i < 5; $i++) {
        yield $i * 2;
    }
}
processItems(generateNumbers());

Генераторы — это специальные функции, которые позволяют генерировать последовательности "лениво", без создания всего массива в памяти:

function readLargeFile(string $path): Generator {
    $file = fopen($path, 'r');
    while (!feof($file)) {
        yield fgets($file);
    }
    fclose($file);
}

// Потребляет память поэтапно, а не весь файл сразу
foreach (readLargeFile('huge.log') as $line) {
    // обработка строки
}

3. Объектно-ориентированные альтернативы

Для более строгой типизации и методов в стиле ООП используются:

  • SPL (Standard PHP Library): SplFixedArray (массив фиксированной длины), ArrayObject
  • Библиотеки коллекций: например, doctrine/collections или illuminate/collections (Laravel)
// Пример с ArrayObject
$collection = new ArrayObject(['a', 'b', 'c']);
$collection->append('d');
$collection->natsort(); // Методы для сортировки

// Пример коллекций Laravel
use Illuminate\Support\Collection;

$col = new Collection([1, 2, 3]);
$filtered = $col->filter(fn($value) => $value > 1)
                ->map(fn($value) => $value * 2);

4. Строгая типизация: типизированные массивы

Хотя PHP не поддерживает типизированные массивы на уровне языка, можно использовать:

  • Документирование через PHPDoc (для статического анализа)
  • Обертку в класс с проверкой типов
/**
 * @param string[] $names - массив строк
 */
function processNames(array $names): void {
    // ...
}

// Класс-коллекция с типизацией
class StringList implements IteratorAggregate {
    private array $items = [];
    
    public function add(string $item): void {
        $this->items[] = $item;
    }
    
    public function getIterator(): ArrayIterator {
        return new ArrayIterator($this->items);
    }
}

5. Сравнение с другими языками

ЯзыкСписковый типОсобенности PHP
Pythonlist, tuplePHP array объединяет списки и словари
JavaArrayList<T>, LinkedList<T>В PHP динамическая типизация, нет дженериков
JavaScriptArrayБлиже всего к PHP, но в JS есть методы map/filter как часть прототипа

Заключение

В PHP массивы (array) — это универсальный и гибкий списковый тип, который покрывает большинство нужд. Для специфических случаев можно использовать:

  • iterable для унификации работы с итерируемыми структурами
  • Генераторы для работы с большими последовательностями данных
  • Объекты-коллекции для ООП-подхода и строгой типизации

Эволюция PHP добавляет всё больше возможностей для работы со структурами данных: типизированные свойства в классах (PHP 7.4), улучшенная работа с итераторами, поддержка ФП-стиля через стрелочные функции (PHP 7.4). Хотя отдельного типа "список" нет, существующие инструменты предоставляют богатые возможности для эффективной работы с упорядоченными коллекциями данных.