Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про PHP: generics, phpdoc, system, collection

Есть ли generics в PHP?

Этот вопрос проверяет понимание системы типов в PHP и знание доступных альтернатив дженерикам из других языков программирования.

Короткий ответ

В PHP нет встроенной поддержки generics (обобщенных типов) как в Java или C#. Однако есть несколько способов достичь похожего поведения. Можно использовать док-блоки с аннотациями для подсказок IDE, создавать конкретные классы-обертки для разных типов, или применять union types и mixed типы. В PHP 8.0 добавлены union types, которые частично решают проблему множественных типов. Также существуют сторонние библиотеки, которые эмулируют поведение generics.

Длинный ответ

Текущее состояние generics в PHP

Отсутствие нативных generics:

  • PHP не поддерживает синтаксис типа Collection<T>

  • Нет проверки generic типов во время выполнения

  • Компиляция не учитывает generic параметры

Альтернативные подходы

Документирование типов через док-блоки

php

/**
 * @template T
 */
class Collection {
    /**
     * @var T[]
     */
    private array $items = [];
    
    /**
     * @param T $item
     */
    public function add($item): void {
        $this->items[] = $item;
    }
    
    /**
     * @return T|null
     */
    public function first() {
        return $this->items[0] ?? null;
    }
}

Использование union types (PHP 8.0+)

php

class StringOrIntCollection {
    private array $items = [];
    
    public function add(string|int $item): void {
        $this->items[] = $item;
    }
    
    public function first(): string|int|null {
        return $this->items[0] ?? null;
    }
}

Практические реализации

Классы-обертки для конкретных типов:

php

class StringCollection {
    private array $items = [];
    
    public function add(string $item): void {
        $this->items[] = $item;
    }
}

class IntCollection {
    private array $items = [];
    
    public function add(int $item): void {
        $this->items[] = $item;
    }
}

Использование mixed с проверкой во время выполнения:

php

class TypedCollection {
    private string $type;
    private array $items = [];
    
    public function __construct(string $type) {
        $this->type = $type;
    }
    
    public function add($item): void {
        if (!$item instanceof $this->type) {
            throw new InvalidArgumentException("Expected {$this->type}");
        }
        $this->items[] = $item;
    }
}

Будущее generics в PHP

  • Ведутся обсуждения о добавлении generics

  • Предложения находятся на стадии RFC

  • Сложности связаны с производительностью и обратной совместимостью

Вывод: Generics отсутствуют в PHP, но есть эффективные альтернативы через документацию, union types и проверки во время выполнения. Для строгой типизации лучше создавать конкретные классы для каждого типа.

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.

Уровень

  • Рейтинг:

    4

  • Сложность:

    6

Навыки

  • PHP

    PHP

Ключевые слова

#generics

#phpdoc

#system

#collection

Подпишись на PHP Developer в телеграм

  • Аватар

    PHP Guru

    Mikhail Savin

    Guru – это эксперты YeaHub, которые помогают развивать комьюнити.