我有一个简单的PHP代码,我想将其拆分为模型,视图,帮助器。 Model应该从helper类访问一些方法,helper类应该从模型类访问一些方法。
我不确定以下模式是否正确。我想这不是因为在这个示例模型中,视图,帮助器将被多次初始化。哪个是最简单的方法来完成我尝试使用下面的代码?
lib / main.php
require_once('lib/model.php');
require_once('lib/helper.php');
require_once('lib/view.php');
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'show';
switch($action){
case "show":
$class->showAction();
break;
case "another":
$class->anotherAction();
break;
}
class main extends abstract{
public function showAction(){
if($this->helper->getParam('browse')){
//something
}else{
$profiles= $this->model->getProfiles();
}
echo $this->view->toHtml($profiles);
}
}
LIB / abstract.php
class abstract{
public function __construct(){
$this->model = new model();
$this->view = new view();
$this->helper = new helper();
}
}
LIB / model.php
class model extends abstract{
public function getProfiles(){
if($this->helper->someMethod(){
//some code
}
//some code
return $profiles;
}
}
LIB / helper.php
class helper extends abstract{
public function someHelperMethod(){
if($this->model->someAnotherMethod(){
//some code
}
//some code
return $profiles;
}
}
答案 0 :(得分:2)
第一个问题是你正在像俄罗斯娃娃一样筑巢。你不应该让你的Abstract类包含 model / view / helper,并且是model / view / helper的 parent 。
我要小心不要使用扩展来确保课程在范围内。
通常情况下,您可以这样考虑:当您的类共享行为或属性时使用扩展,因为它的父级但它需要其他功能,或对现有功能的修改。
"摘要"您定义的类在Model / View / Helper之间没有共享任何属性或方法,因此Model / View / Helper不应该从它扩展。
但是,如果你想要一个"容器"包含每个类类型的实例的类,只需将其作为独立类,不要扩展它,例如:
class Container{
public $model;
public $view;
public $helper;
public function __construct(){
$this->model = new model();
$this->view = new view();
$this->helper = new helper();
}
public function showAction(){
if($this->helper->getParam('browse')){
//something
}else{
$profiles= $this->model->getProfiles();
}
echo $this->view->toHtml($profiles);
}
然后在某个地方开始只实例化一次:
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : 'show';
$class = new Container();
然后,如果你想从Helper中的Model调用一些东西,可以通过多种方式完成。
一个选项,传递对此类的引用并将其保存在Helper中:
// Inside Container
public function __construct(){
$this->model = new model();
$this->view = new view();
$this->helper = new helper($model);
}
Helper类看起来像:
class Helper{
protected $model;
public function __construct($model){
$this->model = $model;
}
public function someHelperMethod(){
if($this->model->someAnotherMethod()){
//some code
}
//some code
return $profiles;
}
}