抱歉,如果这个问题已经得到回答,我是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()
,它允许您创建一个共享的自动加载器,当您尝试使用未知类时会触发该加载器。