<?php /** * 依赖注入 把对象通过参数传递给类 */ //加载M模型类 require_once 'Model.php'; //加载V视图类 require_once 'View.php'; // 控制器C 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(); //实例化控制器类 print_r($controller->index($model,$view)); //调用控制器中的index()操作,完成模型选择与模板输出 <?php /** * 依赖注入 通过构造器的方式来进行 */ //加载M模型类 require_once 'Model.php'; //加载V视图类 require_once 'View.php'; // 控制器C class Controller { protected $model = null; protected $view = null; //构造方法注入 public function __construct(Model $model, View $view) { $this->model = $model; $this->view = $view; } public function index() //依赖注入 { //获取数据 $data = $this->model->getData(); // 获取成绩表中的数据 //渲染模板 return $this->view->fetch($data); //渲染视图展示数据 } } $model = new Model(); //实例化模型类 $view = new View; //实例化视图类 $controller = new Controller($model, $view); //实例化控制器类 print_r($controller->index()); //调用控制器中的index()操作,完成模型选择与模板输出
点击 "运行实例" 按钮查看在线实例
<?php /** *使用容器处理数据 */ //加载Model类 require_once 'Model.php'; //加载视图类 require_once 'View.php'; //创建容器类 class Container { // 创建容器属性,保存类实例化的方法 protected $instance = []; //$alias:类的实例别名,$process:类的实例化过程/函数/Closure闭包类型 public function bind($alias, Closure $process) { // 将类实例方法放入容器中 $this->instance[$alias] = $process; } //创建类的实例,执行容器中的类实例方法 $alias参数是容器中的类实例别名 public function make($alias, $param=[]) { //通过执行回调来输入结果 return call_user_func_array($this->instance[$alias],[]); } } //控制器 class Controller{ public function index(Container $container) { //获取数据,窗口对象的make方法 $data = $container->make('model')->getData(); //渲染数据 return $container->make('view')->fetch($data); } } //将要用到的类实例Model/View绑定到容器中 $container = new Container(); //实例化容器 //将Model类实例方法绑定到容器中,标识为model $container->bind('model',function(){return new Model();}); //同上将View类实例方法绑定到容器中,标签为view $container->bind('view',function(){return new View();}); $controller = new Controller(); echo $controller->index($container);
点击 "运行实例" 按钮查看在线实例
<?php /** * Facade 门面模式又叫外观模式,它可以使用容器中的成员,对外提供一个统一的访问接口。 * 其实就是给容器中的成员,提供一个静态代码,以静态语法来统一对容器成员进行访问 * */ require "Model.php"; require "View.php"; //创建容器类,容器中可以保存很多类型 class Container { //创建容器属性,保存着类实例的创建方法 protected $instance = []; //$alias:类实例别名, $process:类的实例化过程/函数/Closure闭包类型 public function bind($alias, Closure $process) { //将类实例方法存入到容器中 $this->instance[$alias] = $process; } //创建类的实例 执行容器中的类实例方法,$alias参数是容器中的类实例别名 public function make($alias, $params=[]) { return call_user_func_array($this->instance[$alias],[]); } } //将要用到的类实全(MOdel/View)绑定到容器中 $container = new Container(); //将Model类实例方法绑定到容器中,标识model $container->bind('model',function(){return new Model();}); //将View类实例方法绑定到容器中,标识view $container->bind('view',function(){return new View();}); //声明facade类,接管对容器实例方法调用 class Facade { //控制器中调用到了Model类中的getData()方法,View类中的view()方法; //为这两个访问创建一个统一访问的静态接口 //调用方法使用的关键字static:可以实现在静态继承上下文环境中,实现静态成员调用者的动态设置 //后台的Article 就是Facade类的子类,如果不使用static::就无法动态调用子类中的成员 //如果用不到子类,这里可以不用static后台静态绑定,可以使用self::代替 //但使用static,会使代码更具健壮性,实用性 protected static $container = null; protected static $data = []; public static function initialize(Container $container) { static::$container = $container;// 使用static:: 是后期静态绑定的语法 } //设置获取数据的静态***方法:getData() static::$container是引用类Model的实例 public static function getData() { static::$data = static::$container->make('model')->getData(); } //渲染数据使用fetch() public static function fetch() { //static::$container 是当前引用类‘View’的实例 return static::$container->make('view')->fetch(static::$data); } } //声明一个内容类 class Article extends Facade { } //控制器 class Controller { //在构造方法中调用Facade初始化方式,完成容器的实例化:依赖注入 public function __construct(Container $container) { Article::initialize($container); } //将容器对象注入到控制器方法中 public function index() { Article::getData();//获取数据 return Article::fetch(); //渲染模板 } } //***端调用 $controller = new Controller($container); echo $controller->index();
点击 "运行实例" 按钮查看在线实例
4.路由实现前面URL和程序对应
<?php
//获取当前请求的URL地址
//http://tp5.io/route.php/admin/index/hello/id/10/name/xiaopi
$uri = $_SERVER['REQUEST_URI'];
//exit($uri);
//用目录分隔符,解析出URL中的各个部分,DIRECTORY_SEPARATOR是系统分隔符常量
//windows:反斜线'\',linux:正斜线'/'
//echo(DIRECTORY_SEPARATOR);
$req = explode('/',$uri);
echo '<pre>'.print_r($req,true);
$route = array_slice($req,2,3);
echo '<pre>' . print_r($route,true);
list($module, $controller, $action) = $route;
//echo "模块:{$module}<br>控制器:{$controller}<br>操作:{$action}<br>";
$pathinfo['module'] = $module;
$pathinfo['controller'] = $controller;
$pathinfo['action'] = $action;
//echo '<pre>' . print_r($pathinfo,true);
//从pathinfo数组解析出:参数键值对
$values = array_slice($req, 5,6);
echo count($values);
for($i=0;$i<count($values);$i+=2){
$params[$values[$i]] = $values[$i+1];
}
//查询解析出来的参数
echo '<pre>' . print_r($params,true);
class Index
{
public function __construct($pathinfo)
{
$this->pathinfo = $pathinfo;
}
public function hello2($id,$name,$age)
{
return "{$this->pathinfo['module']}模块{$this->pathinfo['controller']}控制器".$this->pathinfo['action']."操作:id={$id},name={$name},age={$age}";
}
}
echo call_user_func_array([(new index($pathinfo)), $pathinfo['action']], $params);
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2018/10/25 * Time: 14:52:45 */ require_once 'lib/Db.php'; //模型类:用户于数据库操作 class Model { public function getData() { $db = new Db(); $res = $db->table('article')->field('id,cid,title,keywords')->lists(); return $res; } }
点击 "运行实例" 按钮查看在线实例
<?php /** *视图类:渲染数据 */ class View { public function fetch($data) { $html = '<table border="1" cellspacing="0" cellpadding="0" width="700" style="text-indent:1rem;line-height: 35px;">'; $html .= '<caption>文章列表</caption>'; $html .= '<tr bgcolor="#cfcfcf"><th>ID</th><th>CID</th><th>标题</th><th>关键词</th></tr>'; foreach ($data as $value) { $html .= '<tr>'; $html .= '<td>' . $value['id'] . '</td>'; $html .= '<td>' . $value['cid'] . '</td>'; $html .= '<td>' . $value['title'] . '</td>'; $html .= '<td>' . $value['keywords'] . '</td>'; $html .= '</tr>'; } $html .= '</table>'; return $html; } }
点击 "运行实例" 按钮查看在线实例
实例1-3的效果图
实例4