3v4l.org

run code in 300+ PHP versions simultaneously
<?php abstract class ToolSetFactory { protected array $products = []; public function make(string $productName, ...$params): Drawable { if ($product = $this->products[$productName] ?? null) return new $product($params); return new NullProduct(); } } class BasicToolSetFactory extends ToolSetFactory { public function __construct() { $this->products['general'] = GeneralProduct::class; $this->products['arrows'] = ArrowsProduct::class; } } // Interfaces interface Drawable { public function draw(): void; } interface General extends Drawable {} interface Arrows extends Drawable {} // Product classes class GeneralProduct implements General { public function draw(): void { print "Drawing general elements\n"; } // Other methods } class ArrowsProduct implements Arrows { public function draw(): void { print "Drawing arrows elements\n"; } // Other methods } // Client code class BasicToolSet { public function createToolSet(ToolSetFactory $factory): void { $general = $factory->make('general'); $arrows = $factory->make('arrows'); foreach ([$general, $arrows] as $product) { $product->draw(); } } } // Usage $basicToolSetFactory = new BasicToolSetFactory(); $basicToolSet = new BasicToolSet(); $basicToolSet->createToolSet($basicToolSetFactory);
Output for 8.1.23 - 8.1.30, 8.2.2 - 8.2.24, 8.3.0 - 8.3.12
Drawing general elements Drawing arrows elements

preferences:
55.1 ms | 406 KiB | 5 Q