PHP如何使每个类访问两个类

时间:2015-09-01 19:52:23

标签: php oop

我有一个简单的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;
  }
}

1 个答案:

答案 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;
    }
}