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


php include classes without using static functions

抱歉,如果这个问题已经得到回答,我是PHP中OOP的新手。 我正在尝试为教育和测试目的构建一个 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 类中为将来可能要包含的每个类声明 home_model 的实例,并避免使用静态函数。

提前感谢,如果您需要任何进一步的信息,请告诉我。

做以下事情有问题吗:

$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对应于文件内的类名)

如果你正在从CodeIgniter学习MVC和OOP,那么你就做错了™。在你对MVC模式有相当深入的理解或OOP之前,你甚至不应该接触MVC模式,因为它非常复杂,需要你理解LoD,SoC,IoC和所有SOLID原则。

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

控制器应该负责根据用户的输入更改模型层和当前视图的状态。不用于创建对象和渲染模板。而且他们不应该返回任何东西。

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

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

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

您认为的"模型"实际上是域对象,它们是模型层的一部分。您确实不应该直接访问它们,但是刚刚开始学习MVC模式的人通常会这样做。我怀疑对于您当前的水平,这个答案会提供最大的好处,但这不是我对 MVC 中模型的理解。对于高级版本,请阅读此内容

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