Php 动态调用类的依赖注入
作为我学习过程的一部分,我正在构建自己的MVC框架,这不仅帮助我学习,而且希望它能帮助我保持未来代码的干净性和可维护性。目前,我正试图了解依赖注入 以下是我正在做的: 我的超简单MVC框架分解为Php 动态调用类的依赖注入,php,oop,dynamic,dependency-injection,Php,Oop,Dynamic,Dependency Injection,作为我学习过程的一部分,我正在构建自己的MVC框架,这不仅帮助我学习,而且希望它能帮助我保持未来代码的干净性和可维护性。目前,我正试图了解依赖注入 以下是我正在做的: 我的超简单MVC框架分解为$\u SERVER['REQUEST\u URI'],并期望第一个元素是类,第二个元素是方法,其余元素都是参数数组。这一切都非常有效 我有一个基本的控制器类,我所有的核心类都扩展了它。该控制器类的唯一功能是促进模型类和视图的需求和实例化,如下所示: class Controller { protect
$\u SERVER['REQUEST\u URI']
,并期望第一个元素是类,第二个元素是方法,其余元素都是参数数组。这一切都非常有效
我有一个基本的控制器类,我所有的核心类都扩展了它。该控制器类的唯一功能是促进模型类和视图的需求和实例化,如下所示:
class Controller {
protected $modelsPath = ROOT . 'app' . DS . 'models' . DS;
protected $viewsPath = ROOT . 'app' . DS . 'views' . DS;
public function model($model) {
$model = ucfirst(strtolower($model));
if (file_exists($this->modelsPath . $model . ".model.php")) {
require_once $this->modelsPath . $model . ".model.php";
return new $model;
} else {
return false;
}
}
public function view($view, $data = []) {
$view = strtolower($view);
if (file_exists($this->viewsPath . $view . DS. $view . "View.php")) {
require_once $this->viewsPath . $view . DS . $view . "View.php";
} else {
die('View does not exist');
}
}
public $database;
protected $modelToCall;
public function __construct($database) {
$this->database = $database;
$tmpClass = strtolower(get_called_class());
$modelToCall = rtrim(ucfirst($tmpClass), 's');
if (file_exists($this->modelsPath . $modelToCall . ".php")) {
require_once $this->modelsPath . $modelToCall . ".php";
$this->modelToCall = new $modelToCall($database);
}
}
这一切都按预期进行
然后我想到,我可以在我的控制器类中使用get\u called\u class()
函数来自动加载支持模型类(如果它存在的话)。因此,我在控制器类中将此代码添加为\u构造
函数:
protected $modelToCall = null;
public function __construct() {
$modelToCall = ucfirst(strtolower(get_called_class()));
if (file_exists($this->modelsPath . $modelToCall . ".model.php")) {
require_once $this->modelsPath . $modelToCall . ".model.php";
$this->modelToCall = new $modelToCall;
}
}
因为这是在我的基本控制器中调用的,它由我刚才调用的任何类扩展,这允许我使用我的模型的方法,比如从我的父类:
class Tests extends Controller {
public function test() {
$this->modelToCall->testsModelMethod();
}
}
现在我的问题是:
这被认为是依赖注入吗?如果没有,是否有一种方法可以从以这种方式动态加载的模型中正确地完成依赖项注入
与简单地从父控制器实例化相比,在我的基本控制器中自动实例化可能没有什么好处
正如我所说的,我正在学习,我想在这种情况下,我只是在寻求比我更有经验和知识的人的指导,所以我希望我的头脑能够围绕这个主题,避免严重的编程错误,这些错误以后会咬到我
提前感谢您的考虑和耐心 好的,我想我已经回答了我自己的问题 这是完全正常的,需要从模型的控制器调用模型,这是我的控制器自动执行的操作。但正如@yivi所指出的,这不是依赖注入 然而,我认为接下来是依赖注入 我回到了我的简单MVC框架的boostrap,并在顶部实例化了我的数据库类。然后,我能够将其传递到我的控制器类中,并通过该类将其注入动态加载的每个模型中,如下所示:
class Controller {
protected $modelsPath = ROOT . 'app' . DS . 'models' . DS;
protected $viewsPath = ROOT . 'app' . DS . 'views' . DS;
public function model($model) {
$model = ucfirst(strtolower($model));
if (file_exists($this->modelsPath . $model . ".model.php")) {
require_once $this->modelsPath . $model . ".model.php";
return new $model;
} else {
return false;
}
}
public function view($view, $data = []) {
$view = strtolower($view);
if (file_exists($this->viewsPath . $view . DS. $view . "View.php")) {
require_once $this->viewsPath . $view . DS . $view . "View.php";
} else {
die('View does not exist');
}
}
public $database;
protected $modelToCall;
public function __construct($database) {
$this->database = $database;
$tmpClass = strtolower(get_called_class());
$modelToCall = rtrim(ucfirst($tmpClass), 's');
if (file_exists($this->modelsPath . $modelToCall . ".php")) {
require_once $this->modelsPath . $modelToCall . ".php";
$this->modelToCall = new $modelToCall($database);
}
}
现在,在任何控制器中,我都可以通过简单地使用$this->modelToCall
调用该控制器的模型方法,并且我可以从每个模型完全访问我的数据库类,我只需实例化它一次
它是有效的,但是我现在的术语正确了吗
提前感谢。不,这不是依赖注入。但问题太长,太冗长。试着把它简化为问题的基本描述和必要的代码。好吧,我们中至少有一个人练习简洁。LOL。所以,如果不是依赖注入,您对如何在这个场景中实现DI有什么指导吗?如上所述,我正在努力学习。