public function isAvailable() : bool; public function warehouses() : array; } class Foo implements Product { public function name() : string { return 'FooProduct'; } public function ammount() : int { return 15; } public function isAvailable() : bool { return $this->ammount > 0; } public function warehouses() : array { return ['PL', 'DE', 'CZ']; } } class ProductFactory { public static function fromName($name) : Product { return new $name(); } } $fooProduct = ProductFactory::fromName('Foo'); echo $fooProduct->name() . ', ammount = ' . $fooProduct->ammount();