2011-11-09 78 views
1

我想使用OOP PHP構建MVC模式。請閱讀帖子的其餘部分,以瞭解我想要的內容。PHP MVC設計問題

這是網頁控制器,其延伸的主控制器

class Home extends Controller { 

    function __construct() { 
     parent::__construct(); 
    } 

    public function index() { 
     $this->load->model("test"); 
     $this->test->get_all(); 
     $data = array (
      'name' => "Amr", 
      'age' =>24 
     ); 
     $this->load->view("home_view",$data); 
    } 

} 

主控制器看起來像這樣,並延伸loader類:

class Controller extends Loader { 
    public $load; 

    function __construct(){ 
     parent::__construct(); 
     $this->load = new Loader(); 
    } 
} 

其具有問題Loader類看起來像這樣

class Loader { 

    public $Error; 

    function __construct(){ 
     $this->Error = new Error(); 
    } 

    public function model($Modelname){ 
     $this->$Modelname = $Modelname; 
     if (file_exists("models/".$Modelname.".php")){ 
      require_once $Modelname . ".php"; 
      $this->$Modelname = new $Modelname; 
     }else{ 
      $this->Error->Not_found(); 
     } 
    } 

    public function view($Viewname,$data=NULL){ 
     if(is_array($data)){ 
      extract($data); 
     } 
     if (file_exists("views/".$Viewname.".php")){ 
      require_once $Viewname . ".php"; 
     }else{ 
      $this->Error->Not_found(); 
     } 
    } 

    public function helper($helper) { 
     if (file_exists("helpers/".$helper.".php")){ 
      require_once $helper . ".php"; 
      $this->$helper = new $helper; 
     }else{ 
      $this->Error->Not_found(); 
     } 
    } 

} 

我需要做的是能夠從主頁控制ler做這樣的事情:

$this->load->model("someModel"); // model name is test 
$this->someModel->someMethodInModel(); // the model method is get_all() 
// and the same for helper 
$this->load->helper("someHelper"); 
$this->someHelper->someMethodInHelper(); 

任何人都可以幫助我嗎?

編輯:錯誤這樣做時,我得到的是:

Notice: Undefined property: Home::$test

Fatal error: Call to a member function get_all() on a non-object

注:型號名稱是test和模型方法是get_all()

回答

0
public function model($Modelname){ 
$this->$Modelname = $Modelname; 
if (file_exists("models/".$Modelname.".php")){ 
require_once $Modelname . ".php"; 
$this->$Modelname = new $Modelname; 

你這是什麼需要幫助?使用您當前的代碼,您可以在您的主控制器中執行

$this->load->model("someModel"); 
$this->someModel->someMethodInModel(); 
// and the same for helper 
$this->load->helper("someHelper"); 
$this->someHelper->someMethodInHelper(); 

。我只是自己試了一下。你會得到什麼錯誤?什麼工作不正常?

+0

我在帖子上做了編輯約翰,這就是我能得到,非常感謝你的時間,並希望你可以幫助我 –

+0

請編輯問題並顯示您當前的代碼。 –

+0

我編輯的代碼當前代碼是即時通訊使用其相同的除了兩條線添加到家庭控制器 –

0

如果我是你,我會在我的控制器中放入一個「load()」方法,它將調用「loader」類並將新模型/幫助程序/視圖存儲到變量中。

0

我認爲你遇到的問題是,你的加載器創建一個模型的實例作爲Loader類的成員,而不是你的控制器類。

+0

索引方法,我怎麼能解決這個問題? –

+0

這是一個範圍問題,也是面向對象編程的基礎之一。你的'Loader'類實例化一個模型,並將它作爲該類的成員加入,而不是調用你的'load()'方法的控制器類。所以要從你的控制器訪問你的模型,你需要像'$ this-> load-> someModel-> someMethodInModel();'來代替。 –

0

如果你的基本控制器擴展裝載機則沒有理由使用它像財產

class Controller extends Loader { 
    public $load; 

    function __construct(){ 
     parent::__construct(); 
     $this->load = new Loader(); 
    } 
} 

改變它

class Controller extends Loader { 

} 

另一種方法是使用魔術方法鉤http://php.net/manual/en/language.oop5.overloading.php#object.get

class Controller { 
    public $load; 

    function __construct(){ 
     parent::__construct(); 
     $this->load = new Loader(); 
    } 

    function __get($modelName){ 
     return $this->load->$modelName; 
    } 


}