文档说明
| 序号 | 文件 | 注释 |
|---|---|---|
| 1 | Connect.php |
数据库链接 |
| 2 | Model.php |
模型类 |
| 3 | View.php |
视图类 |
| 4 | Controller.php |
依赖注入之方法参数形式注入 |
| 5 | Controller2.php |
依赖注入之实列化参数形式注入 |
| 6 | Controller3.php |
服务容器 |
| 7 | Controller4.php |
Facade门面技术 |
1.Connect.php:数据库链接
<?phpnamespace demo_MVC;//数据库参数class Connect{private $param =['DB_HOST'=>'localhost','DB_TYPE'=>'mysql','DB_NAME'=>'my_user','DB_PASSWORD'=>'root123','DB_USER'=>'root','DB_CHARSET'=>'utf8','DB_PORT'=>'3306'];//连接数据public function link(){try{//连接数据款return $pdo = new \PDO("mysql:host=localhost;dbname=my_user;charset=utf8",$this->param['DB_USER'],$this->param['DB_PASSWORD']);} catch(\PDOException $e){//捕捉特定于数据库信息的PDOEXCEPTION 异常echo $e->getMessage();} catch(\Throwable $e){//捕捉拥有Throwable接口的错误或者其他异常echo $e->getMessage();}}}
Model.php :模型类
<?phpnamespace demo_MVC;//加载数据库连接require "./connect.php";class Model extends Connect{//查询数据public function getInfo(){$pdo = parent::link();$sql = "SELECT * FROM `mu_user` LIMIT ?";$limit =6;$stm = $pdo ->prepare($sql);$stm ->bindParam(1,$limit,\PDO::PARAM_INT);$stm ->execute();$result = $stm ->fetchAll();return $result;}}
3.View.php:视图类
<?phpnamespace demo_MVC;class View{public function rendering($result){$table ="<table><caption>用户列表</caption><tr><td>ID</td><td>名称</td><td>电话</td><td>操作</td></tr>";foreach( $result as $list){$table .="<tr><td>".$list['id']."</td><td>".$list['username']."</td><td>".$list['phone']."</td><td><button onclick='location.href='control.php?act=edit&id=".$list['id']."' >编辑</button><button onclick='del(".$list['id'].")'>删除</button></td></tr>";}$table .="</table>";$rend =$table."<style>table{text-align: center;border:2px solid #222;border-collapse: collapse;margin: 0 auto;}tr:first-of-type{background-color:thistle;}td{padding: 10px;border:1px solid #000;}p{text-align: center;}a{text-align: center;border:1px solid #000;text-decoration: none;padding: 5px 10px;margin: 10px 2px;border-radius: 10%;}p>span{font-size: 1.5rem;margin: auto;padding: 10px;}.cla{background-color: lightskyblue;color: lightgoldenrodyellow;border: 1px solid lightskyblue;}</style>";return $rend;}}
4.Controller.php:依赖注入之方法参数形式注入;
作用:解决代码‘代码耦合度’问题
<?phpnamespace demo_MVC;// 加载模型类require "Model.php";// 加载视图类require "View.php";//依赖注入之以控制器方法的参数形式注入class Controller{//展示数据public function list($model,$view){$result = $model ->getInfo();return $view->rendering($result);}}//实列模型类$model = new Model();//实列视图类$view = new View();//客户端调用echo (new Controller)->list($model,$view);
5.Controller2.php:依赖注入之实列化参数形式注入
作用:解决代码‘代码耦合度’问题,且实现外部对象的复用
<?phpnamespace demo_MVC;require "Model.php";require "View.php";//依赖注入之以控实列化参数形式注入class Controller2{private $model;private $view;// 通过构造方法将外部对象初始化,实现了外部对象在当前类的共享/复用public function __construct($model,$view){$this->model = $model;$this->view = $view;}// 获取数据,并展示出来public function list(){$result = $this->model ->getInfo();return $this->view->rendering($result);}}//实列模型类$model = new Model();//实列视图类$view = new View();$Controller = new Controller2($model,$view);echo $Controller->list();
6.Controller3.php:服务容器
总结:将外部对象的依赖,使用服务容器进行了接管,使当前类对许多外部对象的依赖, 转为对一个服务容器的依赖
<?phpnamespace demo_MVC;use Closure;require "Model.php";require "View.php";//服务容器class contriner{// 1. 对象容器protected $obj =[];// 2. 向对象容器中添加对象// 参数1: 是外部对象在当前对象容器数组中的键名/别名// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)public function bind($alias, Closure $proess){return $this->obj[$alias]= $proess;}//调用对象public function make($alias,$param=[]){//return call_user_func_array($this->obj[$alias],$param);}}//示例化容器$contriner = new contriner();//绑定模型类$contriner->bind('model',function(){return new Model();});//绑定视图类$contriner->bind('view',function(){return new View();});class Controller3{//把服务容器当作参数传入public function list(contriner $contriner){$result = $contriner->make('model') ->getInfo();return $contriner->make('view')->rendering($result);}}//客服端调用$Controller = new Controller3();echo $Controller->list($contriner);
7.Controller4.php:Facade门面技术,静态接管服务容器中的成员的访问、
<?phpnamespace demo_MVC;use Closure;require "Model.php";require "View.php";// 服务容器class contriner1{// 1. 对象容器protected $obj =[];// 2. 向对象容器中添加对象// 参数1: 是外部对象在当前对象容器数组中的键名/别名// 参数2: 是当前需要绑定到容器的对象的实例化过程(函数)public function bind($alias, Closure $proess){return $this->obj[$alias]= $proess;}//调用对象public function make($alias,$param=[]){return call_user_func_array($this->obj[$alias],$param);}}//实例化服务容器$contriner = new contriner1();//绑定模型类$contriner->bind('model',function(){return new Model();});//绑定视图类$contriner->bind('view',function(){return new View();});//Facade门面技术, 静态接管服务容器中的成员的访问class Facade{protected static $contriner = null;// 初始化方法: 就是给当前的Facade类扣$container属性赋值// 作用类似Facade的构造方法(但不是)// 将外部的服务容器注入到当前的facade中public static function initialize(contriner1 $contriner){static::$contriner = $contriner;}}//模型类成员访问静态化(给成员套一个静态访问的马甲)class ListMomdel extends Facade{public static function getInfo(){return static::$contriner->make('model')->getInfo();}}//视图类成员访问静态化(给成员套一个静态访问的马甲)class ListView extends Facade{public static function rendering($result){return static::$contriner->make('view')->rendering($result);}}class Controller4{//初始化public function __construct(contriner1 $contriner){Facade::initialize($contriner);}public function list(){$result = ListMomdel::getInfo();return ListView::rendering($result);}}// 客户端调用$Controller = new Controller4($contriner);echo $Controller->list();

在类中经常实例化别的类,会造成代码耦合度过高;为解决这个问题,因而使用依赖注入;但如需要依赖注入外部对象很多,从而实例化很多外部对象,因此通过一个服务容器将外部对象统一示例化管理;而Facade门面技术进一步接管了对服务容器的访问,只需要对Facade进行调用访问
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号