更换接口

时间:2015-11-09 09:05:16

标签: php oop interface

我有一些与他们的系统交互的市场类,如Ebay,Amazon等。

我想让这些类定义一些强制函数,例如createProduct,updateProduct,getCategories,getOrders。

显然,这些市场需要不同格式的数据,所以我的功能要求每个类别中有不同类型和数量的参数。

例如

的eBay

public function createProduct($product, $multi)

亚马逊

public function createProduct(array $products, $multi, $variations)

在这种情况下,我无法实现MarketplaceInterface,因为它会破坏我的代码。

但我必须强制执行这些功能。 我还可以通过PHP实现其他哪些方式?

1 个答案:

答案 0 :(得分:-2)

解决此类问题的一种常用方法是定义optionsResolver,将其传递给您的每个类,以便进行初始化。

$optionsResolver->setRequiredOptions(array('products', 'multi', 'variations'));

然后你将参数作为一个选项数组传递(这样你可以保留你的界面):

public function createProduct($options)

您可以使用以下内容验证您的选项:

$optionsResolver->resolve($options);

要查看完整的实施示例,请查看Symfony2

示例:

class Ebay implements MarketPlaceInterface
{
    // ...

    public function createProduct(array $options = array())
    {
        $resolver = new OptionsResolver();
        $resolver
            ->setRequired(array('product', 'multi'))
            ->setAllowedTypes('product', 'string')
            ->setAllowedTypes('multi', 'boolean')
            ->setDefaults(array('multi' => true))
        ;

        // Add default values.
        // Check for required fields.
        // Check allowed types.
        // Throw an exception if the options have a wrong format.
        $options = $resolver->resolve($options);

        // Do the creation here.
    }
}

class Amazon implements MarketPlaceInterface
{
    // ...

    public function createProduct(array $options = array())
    {
        $resolver = new OptionsResolver();
        $resolver
            ->setRequired(array('products', 'multi', 'variations'))
            ->setAllowedTypes('products', 'array')
            ->setAllowedTypes('multi', 'boolean')
            ->setAllowedTypes('variations', 'array')
            ->setDefaults(array(
                'products' => array(),
                'multi' => true
            ))
        ;

        $options = $resolver->resolve($options);

        // Do the creation here.
    }
}

您还可以在抽象类或操纵市场对象的类中设置行为。以下是具有GOF设计模式template method的抽象类的情况:

abstract class AbstractMarketPlace implements MarketPlaceInterface
{
    // ...

    public function createProduct(array $options = array())
    {
        $resolver = new OptionsResolver();
        $this->setResolver($resolver);
        $options = $resolver->resolve($options);

        $this->doCreateProduct($options)
    }

    abstract protected function setResolver(OptionsResolver $resolver);

    abstract protected function doCreateProduct(array $options);
}

class Ebay extends AbstractMarketPlace
{
    // ...

    protected function setResolver(OptionsResolver $resolver)
    {
        $resolver
            ->setRequired(array('product', 'multi'))
            ->setAllowedTypes('product', 'string')
            ->setAllowedTypes('multi', 'boolean')
            ->setDefaults(array('multi' => true))
        ;
    }

    protected function doCreateProduct(array $options)
    {
        // Do the creation here.
    }
}