Psalm
Get started
Documentation
Paid support
Plugins
Blog
GitHub
<?php class Foo { public function __construct(FooFactory $factory){ } } class FooBar extends Foo { public function __construct(FooBarFactory $factory){ parent::__construct($factory); } } class FooBarBat extends FooBar { public function __construct(FooBarBatFactory $factory){ parent::__construct($factory); } } /** * @template T of Foo */ abstract class FooFactory { /** * @return T */ abstract public function create(): Foo; } /** * @template T of FooBar * @extends FooFactory<T> */ class FooBarFactory extends FooFactory { public function create():FooBar{ return new FooBar($this); } } /** * @extends FooBarFactory<FooBarBat> */ class FooBarBatFactory extends FooBarFactory { public function create():FooBarBat{ return new FooBarBat($this); } } function createWithFactory(FooFactory $factory) :Foo { return $factory->create(); }
Snippet created on March 10 2022 at 16:24 UTC
Settings
Get link