1. 写一个依赖注入的案例, 内容自定义
2. 写一个mvc应用的案例, 内容自定义
3. 写一个简单的路由, 理解路由的原理与目标
课程笔记:
单例模式:类的对象只能实例化一次,应用场景是:数据库的链接,HTTP的请求,通过把构造函数设置成为私有属性,让类的外部无法进行实例化,只能通过调用类里面的方法去进行实例化。方法里面进行判断,如果该类已经被实例化,则已经实例化的对象,如果类还没有被实例化,则实例化一个新的对象,然后返回回去。
工厂模式:批量创建对象的类。如果没有专门拿来创建对象的类的话,用户在调用的时候,就需要知道自己具体需要调用的类是什么,假如这个类名修改了,则用户调用方也需要修改自己的代码。有了工厂类,用户只需要关心自己的调用的是工厂类,并且把自己的参数输入进去,而不需要关心自己这个生成对象需要通过什么类去解决。生成类的方法由工厂类去调用,这样达到解耦的目的。
MVC:M是model,数据模型的意思,是用来读写数据的。V是view,视图的意思,负责对外展示的代码。C是controller,控制器的意思,用来协调后端的数据和前端展示的派发器。
服务容器:将对象的创建和使用过程统一管理起来。对象的管理器,把对象的实例化放在容器中,然后把对象从容器中取出来。
门面模式(facade):把调用代码静态化。
写一个依赖注入的案例, 内容自定义
依赖注入,就是将别的类的方法,通过参数或者方法的形式,直接注入到当前类中,就叫做依赖注入,依赖注入是解耦的重要手段。
<?php require 'Model.php'; require 'View.php'; class Controller{ public function index(Model $model,View $view){ $data = $model->getData(); return $view->fetch($data); } } $model =new Model(); $view= new View(); $controller = new Controller(); //将Model和View的类实例,作为参数注入到方法中 echo $controller->index($model,$view);
点击 "运行实例" 按钮查看在线实例
如果新建model和controller对象是在控制器类里面实现,那么假如model类和view类的构造方法发生了改变,或者类名发生了变化,那么控制器类也就变得不能够使用了。所以用参数的方法注入到控制器类中,那么控制器类就只用专注自己的业务逻辑即可,不用关心其他类的实现方式。
写一个mvc应用的案例, 内容自定义
我将老师课堂上讲的小案例,通过连接数据库,将数据显示到了前端页面上。由于MVC模式的相互独立工作,所以我只需要在model类中将读取的数据方法重写,然后将前端相应的位置重写即可。中间的controller类不需要去动他,这样代码相互之间的独立性就很强了。
model类
<?php class Model{ public function getData(){ $dsn = "mysql:host=127.0.0.1;dbname=huangsijie"; $username = "root"; $password = "root"; $pdo = new PDO($dsn,$username,$password); $sql = "select * from `staff`"; $stmt = $pdo->prepare($sql); $stmt->execute(); $array = $stmt->fetchAll(PDO::FETCH_ASSOC); return $array; } }
点击 "运行实例" 按钮查看在线实例
controller类
<?php require 'Model.php'; require 'View.php'; class Controller{ public function index(Model $model,View $view){ $data = $model->getData(); return $view->fetch($data); } } $model =new Model(); $view= new View(); $controller = new Controller(); //将Model和View的类实例,作为参数注入到方法中 echo $controller->index($model,$view);
点击 "运行实例" 按钮查看在线实例
view类
<?php class View{ public function fetch($data){ $table = '<table border="1" cellspacing="0" width="600" >'; $table .= '<caption>人民的名义信息表</caption>'; $table .= '<tr bgcolor="lightblue"><th>ID</th><th>姓名</th><th>年龄</th><th>性别</th><th>职位</th><th>手机</th><th>入职日期</th></tr>'; foreach ($data as $product) { if($product['sex']==1){ $product['sex'] = '男'; }else{ $product['sex'] = '女'; } $product['hiredate'] = date('Y年m月d日',$product['hiredate']); $table .= '<tr>'; $table .= '<td align="center">' . $product['staff_id'] . '</td>'; $table .= '<td align="center">' . $product['name'] . '</td>'; $table .= '<td align="center">' . $product['age'] . '</td>'; $table .= '<td align="center">' . $product['sex'] . '</td>'; $table .= '<td align="center">' . $product['position'] . '</td>'; $table .= '<td align="center">' . $product['mobile'] . '</td>'; $table .= '<td align="center">' . $product['hiredate'] . '</td>'; $table .= '</tr>'; } $table .= '</table>'; return $table; } }
点击 "运行实例" 按钮查看在线实例
写一个简单的路由, 理解路由的原理与目标
路由就是域名访问的路径,我们通过修改路由,可以将域名解析做自定义的处理。我们通过$_SERVER将域名里面的路由地址解析出来,然后通过explode函数将每个/后面的词变成一个数组。
<?php $url = $_SERVER['REQUEST_URI']; $req = explode('/',$url); echo '<pre>'; print_r($req); $route = array_slice($req,3,3); echo '<pre>'; print_r($route); list($module,$controller,$action) = $route; echo $module.' '.$controller.' '.$action; $values = array_slice($req,6,6); for ($i =0 ; $i < count($values); $i+=2){ $user[$values[$i]] = $values[$i+1]; } echo '<pre>'; print_r($user); class User{ public function add($name,$age,$salary){ return __METHOD__.'方法: 姓名'.$name.' 年龄'.$age.' 工资'.$salary; } } echo call_user_func_array([(new User()),'add'],$user);