2013-11-03 82 views
2

讓我們假設我安排在班我的代碼和每個類都有自己的文件:PHP - 從嵌套類訪問父類成員

  • main.php,上課主要
  • 的config.php具有類配置
  • security.php具有類SECURI TY
  • database.php中上課數據庫

現在,主要的構造函數將初始化3個對象,每個對應一個其他類的,而這一切的方式看起來會比較或不像一個類/子類。問題是,現在安全可能需要一些東西(變量或功能)從配置數據庫東西來自安全。

// main.php 
// here I include the other files 
class Main { 
    functions __constructor() { 
     $this->Config = new Config(); 
     $this->Security = new Security(); 
     $this->Database = new Database(); 
    } 
} 

// config.php 
class Config { 
    public $MyPassword = '123456'; 
    public $LogFile = 'logs.txt'; 
    // other variables and functions 
} 

// security.php 
class Security { 
    functions __constructor() { 
     // NOW, HERE I NEED Config->Password 
    } 

    function log_error($error) { 
     // HERE I NEED Config->LogFile 
    } 
} 

// database.php 
class Database { 
    functions __constructor() { 
     // Trying to connect to the database 
     if (failed) { 
      // HERE I NEED TO CALL Security->log_error('Connection failed'); 
     } 
    } 
} 

那麼,如何共享裏面主要這些嵌套類之間的函數和變量?當然,我可以將這些變量作爲參數發送給構造函數,但是當我們需要5或10個變量時會發生什麼?我可以在整個對象發送配置安全安全數據庫

// main.php 
// here I include the other files 
class Main { 
    functions __constructor() { 
     $this->Config = new Config(); 
     $this->Security = new Security($this->Config); 
     $this->Database = new Database($this->Security); 
    } 
} 

而且是可靠的?我可以只發送參考文件(如C++中的指針)嗎?也許我可以在構造函數中將這個對象的引用作爲參數發送出去,這樣就可以讓所有東西都可用。

// main.php 
// here I include the other files 
class Main { 
    functions __constructor() { 
     $this->Config = new Config(); 
     $this->Security = new Security(&$this); 
     $this->Database = new Database(&$this); 
    } 
} 

我甚至不知道這是否可能。 你覺得呢?有沒有更多的傳統方式?

+0

配置可能是一個靜態類。或者,你的類可以繼承基類Config。 –

+0

數據庫需要安全和安全需要配置。如果安全性繼承Config和數據庫繼承安全性,數據庫是否繼承Config?如果安全需要數據庫呢? – ali

+0

是的,它確實繼承了配置:) –

回答

0

正如評論中所述,您開始思考與依賴注入相關的術語。你在防禦性編碼(以及正確的)來解決SoC(分離問題)的問題。你可以嘗試像我所做的那樣,我稱之爲註冊模式(我對這個主題無知,因此我在Windows註冊表之後命名它)。註冊表包含可能需要傳遞的所有對象。這給一些好處實用水平

  • 如果我不知道別的東西將需要一個變種,我只是把它釘住到註冊表和依賴就會知道到哪裏尋找它的人,如只要我通過他註冊表
  • 如果我的項目是非常小的,我不希望身邊麻煩事太多關於這個想法,那麼這是一個簡單的解決方案

有相當多的一組問題的背後這種思維模式。說項目開始變得更大,我知道它有時候會發生在我身上。現在,像調試這樣的簡單任務變成了登山,因爲我試圖找出爲什麼依賴不在我正在尋找它的地方,而且我必須跟蹤它的設置位置和位置,以及其他一些代碼是否改變了它,爲什麼。

所有這些意思是說,我們不是遵循SoC原則,而是將關注點傳遞給了現在承擔全部責任的第三個對象。這個「註冊表」對象現在負責太多事情,任何發生在它上面的變化都會影響你的所有代碼。

從我讀過的SO和其他教程中,如果你有一個對象是雜耍過多的依賴關係(假設有10個參數的構造函數),那麼我們可能不會做正確的事情。

我希望別人能附和這個,因爲我對這個問題很感興趣,但我一直無法把它在實踐中(主要是由於無知)