php包含不使用静态函数的类

时间:2012-08-14 00:41:54

标签: php model-view-controller class function static

很抱歉,如果已经回答了这个问题,我是PHP的新手。我正在尝试构建一个用于教育和测试目的的mvc,并增加我对它的了解。我陷入了困境,无法弄清楚。我确信这是一个简单的解决方案,但我不知道正确的术语/单词是什么样的。

如果答案已经存在,请告诉我。

以下是我要做的事情:

class Load {
  public function __construct(){
  }

  public function model($file_name){
    include($file_name.'.php');
  }
}

class Home_model extends M_F_Model{
  function __construct() {
    parent::__construct();
  }

  public static function test_this_model($var){
    $result = $var.'+2';
    return $result;
  } 
}

class M_F_Controller {
  public $load;

  public function __construct(){
    $this->load = new Load();
  }
}

class Home extends M_F_Controller{
  function __construct(){
    parent::__construct();
    $this->load->model('home_model');       
  }

  function index($var){
    $result = Home_model::test_this_model($var);
    return $result;
  }
}

我想将Home_model::test_this_model();转换为$this->home_model->test_this_model();,而不必在home_model类中声明我可能希望将来包含的每个类的Home实例,并避免使用静态函数。

在此先感谢您,如果您需要任何进一步的信息,请与我们联系。

2 个答案:

答案 0 :(得分:1)

是否存在以下问题:

$this->home_model = $this->load->model('home_model');

在Home的构造函数内部,然后修改加载器类的model函数以返回一个新实例而不是仅包含该文件?类似的东西:

public function model($file_name) {
    include $file_name . '.php';
    $model = new $file_name();
    return $model;
}

(这假设$file_name对应于文件内的类名)

答案 1 :(得分:1)

如果你正在从CodeIgniter学习MVC和OOP,那么你做错了™。在你有更高级的理解或OOP之前,你甚至不应该触及MVC模式,因为它非常复杂,需要你理解诸如LoDSoCIoC等所有内容。 SOLID principles

模型不是类或对象。这是一层。 MVC模式由两层组成:模型层和表示层。表示层主要由视图,控制器和模板组成,它提供用户界面并处理用户与其交互的方式。

控制器应该负责根据用户的输入改变模型层的状态和当前视图。不适用于创建对象和渲染模板。他们不应该退货。

控制器中的基本工作流程应为:

  • 更改当前视图的状态
  • 从模型层获取结构
  • 在该结构上执行方法

答案:除非您想将每个控制器绑定到特定结构,否则您需要两行来处理模型层。

您认为“模型”实际上是domain objects,它们是模型层的一部分。你真的不应该直接访问它们,但是刚刚开始学习MVC模式的人通常会这样做。我怀疑对于你当前的级别,this answer会提供最大的好处,但这并不是我理解MVC模型的方式。对于高级版本read this

另外,手动加载每个类是非常过时的做法。从PHP 5.1开始,我们有spl_autoload_register(),当您尝试使用未知类时,可以创建一个共享自动加载器。