Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在这种情况下,使用特征而不是继承或组合来重用代码有多糟糕?_Php_Inheritance_Composition_Traits - Fatal编程技术网

Php 在这种情况下,使用特征而不是继承或组合来重用代码有多糟糕?

Php 在这种情况下,使用特征而不是继承或组合来重用代码有多糟糕?,php,inheritance,composition,traits,Php,Inheritance,Composition,Traits,我有一组扩展泛型类的服务,泛型类提供了它们之间的一些公共功能 一组特定的服务有一个共同点:它们在API中使用特定的资源,因此它们有很多共同的代码(连接到API并执行一些GET或POST,应用API要求,基本上更改端点和要传递的参数数量) 我的问题是,根据一个特性抽象这个代码是不是不好?并在需要使用特定代码段的任何服务上重用它 下面是一些例子: trait ApiResource { public function retrieve() { try {

我有一组扩展泛型类的服务,泛型类提供了它们之间的一些公共功能

一组特定的服务有一个共同点:它们在API中使用特定的资源,因此它们有很多共同的代码(连接到API并执行一些GET或POST,应用API要求,基本上更改端点和要传递的参数数量)

我的问题是,根据一个特性抽象这个代码是不是不好?并在需要使用特定代码段的任何服务上重用它

下面是一些例子:

trait ApiResource {
    public function retrieve()
    {
        try {
            // apply logic of the resource
        } catch (\Exception $e) {
            return false;
        }
    }
}

class Departments extends Generic {
    use ApiResource;

    public function createCache(Cache $cache)
    {
        $cache->storeDepartments($this->retrieve('departments', 200));
    }
}

class Brands Generic {
    use ApiResource;

    public function createCache(Cache $cache)
    {
        $cache->storeBrands($this->retrieve('brands'));
    }
}

把它作为一个特性包含进来并不是天生的错误(双关语的意思),但我认为它作为一个抽象类(通过
Generic
扩展,甚至只是包含在
Generic
中)会更有意义

假设此方法将应用于所有
ApiResources
s,但它只适用于
ApiResources
——它不会用于任何其他类。因此,
ApiResource
s应该正常地继承它


特征通常用于一个类继承来自多个源的方法,或者用于多个不相关的类继承该方法——这里的情况似乎都不是这样。我看到很少有人认为性格有好处,而这似乎不是其中之一。

事实并非如此。Trait是一种语言辅助的复制粘贴。以你想要的方式使用它没有什么错。这是一个基于观点的问题,所以我相信它处于如此允许的边缘。话虽如此,我很少发现特质是个好主意,尽管确实存在例外。在我看来,对象组合将是更好的选择。某种ApiConnector,可以位于ApiResources的属性内,用于与API的实际通信。