2015-06-03 52 views
1

假設我們有一個MVC模式。如果我們有這樣的事情:

blog_controller.php

<?php 

class c_blog{ 
    private $model; 

    public function __construct(){ 
     include([model_path]); 
     $this->model = new m_blog(); 
    } 

    public function post_list(){ 
     return $this->model->get_list(); 
    } 
} 

blog_model.php

<?php 

class m_blog{ 
    public function get_list(){ 
     global $db; 
     $sel = $db->query("..."); 
     $sel = $db->fetch_array($sel); 
     return $sel; 
    } 
} 

的index.php

<?php 

$db = new database(); 
include "blog_controller.php"; 
$blog = new c_blog(); 
var_dump($blog->post_list()); 

?> 

爲什麼上面的例子不好,很多開發者想要OOPclass m_blog extends database{}


我只想要一些優點和不足,因爲我用了15個站點這個「愁」的方法具有高流量,我沒有問題(一些網站與多數據庫工作,它很容易改變全球$db,全球$db_five。)

謝謝!

+0

因爲在這種情況下使用'global'是不好的做法。有更高效的替代方法,例如將'$ db'對象注入類中。通常稱爲[依賴注入](https://en.wikipedia.org/wiki/Dependency_injection)。 – Darren

+0

你想說的是這樣的:在模型中創建__construct,在模型中創建一個$ dataconnection變量,並在一個函數中調用全局$ db; $ db-> query(),這樣做:$ this-> dataconnection-> query()? –

+0

完全一樣的東西是的!基本上在類之間共享資源。 (*這不是我使用的完全術語,但多數民衆贊成*) – Darren

回答

0

爲什麼不使用繼承?

<?php 

class model { 
    private $db; 

    public function __construct() { 
     $this->initDb(); 
    } 

    private function initDb(); 
} 

class c_blog { 
    private $model; 

    public function __construct(){ 
     include([model_path]); 
     $this->model = new m_blog(); 
    } 

    public function post_list(){ 
     return $this->model->get_list(); 
    } 
} 

class m_blog extends model{ 
    public function __construct() { 
     parent::__construct; 
    } 
    public function get_list(){ 
     $sel = $this->db->query("..."); 
     $sel = $this->db->fetch_array($sel); 
     return $sel; 
    } 
} 
+0

它是好吧,但不適合我的問題。我希望能夠在我的代碼中隨處使用$ db。因爲我有很多新手,所以我不想改變所有的OOP。如果我啓動$ model-> db ..我將有2個相同的db連接實例.. :( –

+0

然後,我會建議在模型類中使用$ db的靜態變量。 –

+0

@MihaiZinculescu如果您的軟件被破壞到不同的層次,你不需要在任何地方訪問你的數據庫,每一層都有它在數據訪問層(DAL)中與數據庫相關的功能的責任 – ibanore

相關問題