2015-09-28 183 views
2

我想用構造函數中的變量擴展一個類。這裏有一個小例子。擴展類(PHP)的變量

我有我的index.php與它下面的代碼。

<?php 

namespace System; 

require_once 'App/Config.php'; 

spl_autoload_register(function($class) use ($config) { 
    require_once $config['app']['root'] . '/' . $class . '.php'; 
}); 

$app = new App($config); 
$app->Start(); 

?> 

一切工作正常。現在我在類App的構造函數中傳遞了配置文件。

<?php 

namespace System; 
use System\Librarys\Database; 

class App 
{ 
    protected $config; 
    protected $connection; 

    public function __construct($config) 
    { 
    $this->config  = $config; 
    $this->connection = $this->getConnection(); 
    } 

    public function getConnection() 
    { 
    $this->connection = new Database; 
    $this->connection = $this->connection->Connect(); 

    return $this->connection; 
    } 

    public function Start() 
    { 
    echo 'test'; 
    } 

    public function __destruct() 
    { 
    $this->config  = null; 
    $this->connection = null; 
    } 
} 

?> 

好吧,一切都好!但現在,我想建立數據庫連接。我在數據庫類中擴展了「App」類。如下圖所示:

<?php 

namespace System\Librarys; 
use System\App; 

class Database extends App 
{ 
    public function __construct() 
    { 
    parent::__construct(??? HOW DO I GET THE VARIABLE FROM THE "APP" CLASS ???); 

    var_dump($this->config); 
    } 
} 

?> 

現在,如果我在$this->configvar_dump()返回null。這很明顯,因爲我沒有通過父構造函數中的$config var。但我該怎麼做?我想在App類中設置所有變量,以便擴展它,而不需要將變量傳遞給其他類。

+0

您需要將它傳遞到'Database'類。 – AbraCadaver

+0

我嘗試的是在App類中設置所有變量,然後通過擴展的「App」類在數據庫類中訪問它。 –

+0

這不是擴展工程。 – AbraCadaver

回答

1

我不明白爲什麼你只是在Database類中不使用相同的構造函數。 的代碼會是這樣的:

public function __construct($config) 
{ 
    parent::__construct($config); 
} 

然後在App

$this->connection = new Database($this->config); 

順便說一句,如果你不打算給更多的代碼添加到Database構造函數,你不」實際上需要它。

P.S. 我在你的代碼中看到糟糕的類設計。您可能使用App類爲全球配置和數據庫連接是它的一部分。所以你需要創建一個能處理所有數據庫操作的類。然後,您只需在App的實例中使用它。例如:

class DB { 
    function connect() { /* Some code */ } 
    // More functions 
} 

class App { 
    protected $db; 
    // contructorts etc 
    function run() { 
     $this->db = new DB(/* some config */); 
     // use it 
    } 
} 
+0

是的,我知道這一點,但你知道我有很多類,並通過每個類傳遞變量是很難的,我的意思是有沒有一個簡單的方法來做那些沒有靜態變量? –

+0

查看編輯答案。如果你有很多課程,你必須在整個結構中傳遞一些變量 - 你的課程設計不好。 – Timofey

0

當你調用Database__construct(),你不能從App,因爲它沒有被設定得$this->config

您必須先在構造函數中設置變量,然後才能使用它。

class Database extends App 
{ 
    public function __construct() 
    { 
     parent::__construct("localhost"); 
     var_dump($this->config); // $this->config is now "localhost" 
    } 
}