2011-11-09 56 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; 
    } 


}