Как вернуть общий интерфейс в PHP/PHPStan?Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Как вернуть общий интерфейс в PHP/PHPStan?

Сообщение Anonymous »

Я использую дженерики для ввода подсказок некоторых классов и интерфейсов в php/phpstan. Я хочу добиться того, чтобы функция возвращала объект интерфейса, но с общими подсказками:

Код: Выделить всё

class Car
{
}

/**
* @template S of object
*/
interface BuilderInterface
{
/**
* @return S
*/
public function build(): object;
}

/**
* @implements BuilderInterface
*/
class CarBuilder implements BuilderInterface
{
public function build(): object
{
return new Car();
}

public function notAnInterfaceFunc(): void
{
}
}

/**
* @template T of BuilderInterface
* @param class-string $builderClass
* @return T
*/
function createBuilder(string $builderClass): BuilderInterface
{
return new $builderClass();
}

/**
* @template T of BuilderInterface
* @param class-string $builderClass
* @return BuilderInterface
*/
function createBuilder1(string $builderClass): BuilderInterface
{
return new $builderClass();
}

$builder = createBuilder(CarBuilder::class);
\PHPStan\dumpType($builder->build()); // proper return object is of type Car
$builder->notAnInterfaceFunc(); // the function is callable

$builder1 = createBuilder1(CarBuilder::class);
\PHPStan\dumpType($builder1->build()); // return object is 'object'
$builder1->notAnInterfaceFunc(); // is not callable
Взгляните на обе функции createBuilder(). Второй действует так, как я хочу, и возвращает интерфейс CarBuilder::class, но он неправильно устанавливает общий тип для класса CarBuilder.
Чего я хочу: Я создал вставку phpstan, так что вы можете поиграть с кодом: https://phpstan.org /r/3fa3c78c-fff1-4590-8778-51e7475c470a.

Подробнее здесь: https://stackoverflow.com/questions/783 ... hp-phpstan
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»