Как в PHP вернуть из функции тип класс, переданный туда в виде аргумента
В Laravel есть функция app(), которая принимает на вход путь до класса (например app(MyClass::class) и возвращает его экземпляр. Мне нужно написать такую же функцию. Условно это выглядит так:
class MyClass {}
function app(string $path)
{
return new $path();
}
app(MyClass::class) // должен вернуться объект класса MyClass
Проблема в том, что тип возвращаемого значения не определен (mixed). Соответственно никакие подсказки не работают, IDE начинает путаться и работать с такой функцией не комфортно. Однако у Laravel эта же функция возвращает объект того класс, который был передан ей в качестве параметра.
// Laravel
app(MyClass::class) // тип MyClass
// Моя реализация
app(MyClass::class) // тип mixed, подсказки не работают
Если бы в php были дженерики, можно было бы сделать что-то типа:
function app<T>(string $path): T
{
return new $path();
}
app<MyClass::class>(MyClass::class);
но дженериков в php пока нет, а Laravel справляется и без них. Любая IDE понимает, что возвращаемый тип у функции тот же, что был передан ей в качестве параметра. Я смотрел способ через phpDocs, по типу @psalm-return и @template, но ничего из этого не сработало.
Соответственно вопрос: как создать функцию, которая будет так же типизировать возвращаемое значение на основе типа аргумента?
UPD:
По умолчанию типов для app() нет. С этим помогает ide-helper. Однако запускать команду генерации нужно лишь один раз, и все новые классы при подстановке в app будут из него возвращаться с правильным типом. Немного напутал про причину, но вопрос остаётся открытым: ведь ide-helper как-то смог реализовать нужное поведение
Ответы (1 шт):
Можно указать тип возвращаемого функцией значения
function app(string $path): MyClass
{
return new $path();
}