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();