Этот вопрос проверяет понимание системы типов в PHP и знание доступных альтернатив дженерикам из других языков программирования.
В PHP нет встроенной поддержки generics (обобщенных типов) как в Java или C#. Однако есть несколько способов достичь похожего поведения. Можно использовать док-блоки с аннотациями для подсказок IDE, создавать конкретные классы-обертки для разных типов, или применять union types и mixed типы. В PHP 8.0 добавлены union types, которые частично решают проблему множественных типов. Также существуют сторонние библиотеки, которые эмулируют поведение generics.
Отсутствие нативных 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;
}
}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
Предложения находятся на стадии RFC
Сложности связаны с производительностью и обратной совместимостью
Вывод: Generics отсутствуют в PHP, но есть эффективные альтернативы через документацию, union types и проверки во время выполнения. Для строгой типизации лучше создавать конкретные классы для каждого типа.