Correction status:qualified
Teacher's comments:不错, mvc其实并非想像中的难, 是不是?
第一 单例模式 单例模式指的是不允许类进行多次实例化,应用场景数据库连接对象,HTTP请求等。 将类的__construct和__clone魔术方法设置成private,这个类就变成了单例模式。然后再类里面声明一个静态方法,使得外部可以用这个方法来获取这个类的实例
第二 工厂模式用来批量创建对象,工厂模式可以使用接口和抽象类来创建,然后创建一个子类来继承
第三 MVC设计原理 M-Model,数据,针对数据库的操作,CURD V-View,视图,Html文档,浏览器中展示的页面 C-Controller,控制器,数据和视图都要在控制器中进行调用
第四 依赖注入将模型类和视图类的实例化过程放到控制器类外,以方法参数注入到控制器类中。注入点 控制器中的构造方法。
服务容器将对象的创建与使用的过程进行统一管理 也叫容器。实现类的实例化,门面模式facade,外观模式,静态代理。
第五 路由原理 路由的目标将url中的操作映射到控制器上的方法上
作业:写一个依赖注入的案例, 内容自定义
<?php //依赖注入 class name{ public $name; public function __construct($name) { $this->name=$name; } public function name(){ return '我的名字是'.$this->name; } } class age{ public $age; public function __construct($age) { $this->age=$age; } public function age(){ return '我的年龄是'.$this->age; } } class info{ public $getName; public $getAge; //使用构造方法注入类的实例化 public function __construct($getName,$getAge) { $this->getAge=$getAge; $this->getName=$getName; } public function getInf(){ return $this->getName->name().$this->getAge->age(); } //直接在普通方法上注入类的实例化 public function getInfo($getName,$getAge){ return $getName->name().$getAge->age(); } } //使用魔术方法__construct将名字传入到name类中 $name=new name('小新'); //使用魔术方法__construct将年龄传入到age类中 $age=new age(18); //使用魔术方法__construct将类的实例化以参数的方式传入到info类中 $info=new info($name,$age); echo $info->getInf(); echo '<br>'; //在普通方法上 echo $info->getInfo($name,$age);
点击 "运行实例" 按钮查看在线实例
作业二:写一个mvc应用的案例, 内容自定义,写了一个查询数据库并展示数据的MVC,但事实上到服务容器和门面模式基本上都是对照着代码写的,尴尬!
Model模型代码
<?php namespace mvc; // 模型类: 操作数据库 class Model { public function select($table='staff',$flieds='*',$where=''){ //直接将数据库的链接参数写到了这里 $dsn='mysql:host=127.0.0.1;dbname=www.html.io'; $pdo=new \PDO($dsn,'root','root'); $where=empty($where) ? ' ':' WHERE '.$where; $sql='SELECT '.$flieds.' FROM '.$table.$where; $stmt=$pdo->prepare($sql); if($stmt->execute()){ $list=$stmt->fetchAll(); return $list; }else{ return $stmt->errorInfo(); } } }
点击 "运行实例" 按钮查看在线实例
View视图代码
<?php namespace mvc; class View{ public function fetch($data){ $table='<table border="1" cellpadding="5" cellspacing="0">'; $table.='<caption>信息表</caption>'; $table.='<tr bgcolor="#fffff00"><td>姓名</td><td>年龄</td><td>职位</td><td>电话</td><td>上任时间</td></tr>'; foreach($data as $value){ $table.='<tr><td>'.$value['name'].'</td><td>'.$value['age'].'</td><td>'.$value['position'].'</td><td>'.$value['mobile'].'</td><td>'.date('Y年m月d日',$value['hiredate']).'</td></tr>'; } $table.='</table>'; return $table; } }
点击 "运行实例" 按钮查看在线实例
Controller控制器代码
<?php namespace mvc; require 'Model.php'; require 'View.php'; class Container{ //创建一个空数组用来保存类的实例化过程 protected $instance=[]; //将类实例的实例化保存到之前的数组中 public function bind($alias,\Closure $closure){ $this->instance[$alias]=$closure; } //将类的实例化从容器池中取出来 public function make($alias){ return call_user_func_array($this->instance[$alias],[]); } } //实例化服务容器 $container=new Container(); //绑定Model类到容器中 $container->bind('model',function(){ return new Model(); }); //绑定View类容器中 $container->bind('view',function(){ return new View(); }); //门面Facade class Facade{ //创建一个静态属性用来保存服务容器 protected static $container=null; //创建一个空的数组用来保存模型中获取的数据 protected static $data=[]; //给容器赋值 public static function initialize(Container $container){ static::$container=$container; } //将获取数据的select方法进行一个静态处理 public static function select(){ static::$data=static::$container->make('model')->select(); } //将渲染数据的fetch方法进行一个静态处理 public static function fetch(){ return static::$container->make('view')->fetch(static::$data); } } class Controller{ //使用构造方法注入容器对象 public function __construct(Container $container) { Facade::initialize($container); } public function index(){ //获取数据 Facade::select(); //返回并渲染 return Facade::fetch(); } } $controller=new Controller($container); echo $controller->index();
点击 "运行实例" 按钮查看在线实例
最后的实现效果
作业:写一个简单的路由, 理解路由的原理与目标
<?php $uri=$_SERVER['REQUEST_URI']; $list=explode('/',$uri); echo '<br><pre>'; print_r($list); echo '</pre>'; // http://www.html.io/1011/demo4.php/home/user/add/name/xiaoxin/age/18/gender/1/hobby/ball $value=array_slice($list,6,8); echo '<br><pre>'; print_r($value); echo '</pre>'; $params=[]; for($i=0;$i<count($value);$i+=2){ $params[$value[$i]]=$value[$i+1]; } echo '<br><pre>'; print_r($params); echo '</pre>'; class userInfo{ public $name; public $age; public $hobby; public function __construct($name,$age,$hobby) { $this->name=$name; $this->age=$age; $this->hobby=$hobby; } public function user(){ return '姓名:'.$this->name.',年龄:'.$this->age.',爱好:'.$this->hobby; } } $userInfo=new userInfo($params['name'],$params['age'],$params['hobby']); echo $userInfo->user();
点击 "运行实例" 按钮查看在线实例