Как в 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 шт):

Автор решения: evgeni2306

Можно указать тип возвращаемого функцией значения

function app(string $path): MyClass
    {
        return new $path();
    }
→ Ссылка