Suponga que tiene una clase como:
class MyClass { public function __construct(public int $id, public string $foo) { } }y un generador que crea múltiples instancias de esa clase como esta:
$myGenerator = function (): \Generator { yield new MyClass(id: 21, foo: 'fnord'); yield new MyClass(id: 13, foo: 'baz'); yield new MyClass(id: 42, foo: 'Thanks for the fish'); };¿Cómo puedo escribir una función de generador para que deduzca el tipo de cada elemento durante la iteración?
foreach ($myGenerator as $instance) { $instance-> // no autocompletion in IDE as type is not known }no quiero hacer:
foreach ($myGenerator as $instance) { /** @var MyClass $instance */ $instance-> // now autocomplete works inside an IDE }ya que molestaría cada uso del generador con sugerencias redundantes. Quiero proporcionarlo una vez en el mejor nivel del tipo de retorno del generador.
¿Hay una mejor alternativa para escribir un generador?
En pseudocódigo, esperaría poder hacer algo como:
$myGenerator = function (): \Generator<MyClass> {...}Supongo que el sistema de tipos de php no está preparado para esto, no me importaría usar phpdocs/phpstan. El caso de uso principal es la compatibilidad con IDE (en mi caso, phpStorm, aunque debería funcionar más allá de eso).
Como otras colecciones sobre phpdoc
/** * @return \Generator|MyClass[] */ $myGenerator = function (): \Generator { yield new MyClass(id: 21, foo: 'fnord'); yield new MyClass(id: 13, foo: 'baz'); yield new MyClass(id: 42, foo: 'Thanks for the fish'); };