簡體   English   中英

PHP類:抽象,特征,擴展,接口,單例

[英]PHP classes: abstract, traits, extend, interface, singletons

我的“播放列表”課程很長; 具有可以處理播放列表緩存,變量和預設等功能。

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;
    }
}

因此,播放列表對象將傳遞給每個“子類”。 如果我很了解,這稱為依賴注入 我不確定這是否很聰明,因為

  • 在我看來,這是一種非常奇怪的編碼方式。
  • 它在我的代碼中產生遞歸,例如。 播放列表對象被傳遞給PlaylistCache類; 但是PlaylistCache IS是在播放列表對象中定義的,這使...令人討厭。 如果我的播放列表對象是print_r,我將看到代碼中寫有RECURSION

但是我需要能夠通過每個子類訪問整個播放列表對象,這是我目前發現的唯一方法。

我已經知道有關擴展類的信息 ,但我不想在這里擴展類:緩存,變量和預設不是另一種播放列表,它們是我的播放列表需要填充的“屬性”。

我挖了一點,讀了有關Abstract ClassesTraitsInterfaces的信息 ,我想我的解決方案就在其中。 但是我找不到地方,而且很難理解,因為它真的很抽象,英語不是我的母語。

那么:有人知道我的意思並提出建議嗎? 謝謝 !

一些評論具有誤導性。 “子”類使用“依賴注入”,而不是“繼承”父/子關系。 但是,播放列表(父級)類確實使用合成。

構造函數中的&組成“ 通過引用傳遞 ”。 要按值傳遞,該類將需要訪問器方法 如果您只想說一個實例...當前播放列表,那么單身人士就很有意義。 特性是復制粘貼解決方案-單例模式的設計可以包含在特征中,但單例的使用則不能。

考慮播放列表*類實際上從播放列表中需要什么,並考慮顯式傳遞這些值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM