PHP类:抽象,特征,扩展,接口,单例

时间:2016-01-15 11:16:59

标签: php class oop inheritance extending

我有一个很长的播放列表"类;具有处理播放列表缓存,变量和预设等功能。

class Playlist{

    var $cache;
    var $variables;
    var $preset;

    function __construct(){
        $this->cache = populate_cache();
        $this->variables = $this->populate_variables();
        $this->preset = $this->populate_preset();
    }
    function populate_cache(){
    }
    function populate_variables(){
    }
    function populate_preset(){
    }
}

由于它变得非常难以阅读(与缓存,变量,预设有关的东西的许多功能),我开始将它分成几个类(代码在这里减少):

class Playlist{

    var $cache;
    var $variables;
    var $presets;

    function __construct(){
        $this->cache = new PlaylistCache($this);
        $this->variables = new PlaylistVariables($this);
        $this->presets = new PlaylistPreset($this);
    }
}

class PlaylistCache{
    var $playlist;
    function __construct(&$playlist){
        $this->playlist = $playlist;
    }
}

class PlaylistVariables{
    var $playlist;
    function __construct(&$playlist){
        $this->playlist = $playlist;
    }
}

class PlaylistPreset{
    var $playlist;
    function __construct(&$playlist){
        $this->playlist = $playlist;
    }
}

因此播放列表对象被传递给每个"子类"。如果我很好理解,这称为Dependency Injection

,我不确定这是非常聪明的
  • 在我看来,这是一种非常奇怪的编码方式。
  • 它在我的代码中产生递归,例如。播放列表对象传递给PlaylistCache类;但PlaylistCache是​​在播放列表对象中定义的,这使得......成为一个讨厌的循环。如果我print_r我的播放列表对象,我会在代码中看到 RECURSION

但我需要能够通过每个子类访问整个播放列表对象,这是我目前找到的唯一方法。

我已经知道extending classes,但我不想在这里扩展我的课程:缓存,变量和预设不是一种不同的播放列表,它们是"属性"我的播放列表需要填充。

我挖了一下并阅读了Abstract ClassesTraitsInterfaces,我想我的解决方案就在那里。但我找不到哪里,我很难理解,因为它真的很抽象,英语不是我的第一语言。

所以:有人看到我的意思并有建议吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

有些评论具有误导性。 "孩子"类使用依赖注入而不是继承父/子关系。但是,播放列表(父)类确实使用了合成。

构造函数中的&&#;; passing by reference'。要按值传递,该类需要accessor methods。如果您只想要一个说...当前播放列表的实例,singleton是有意义的。 Traits是一个复制粘贴解决方案 - 单例模式的设计可以放在一个特征中,但不能使用单例。

考虑播放列表中实际需要的播放列表*类,并考虑明确传递这些值。