写一个依赖注入的案例, 内容自定义。
将Model和View的类实例, 做为参数,注入到控制器的方法中,这就叫做:依赖注入。
新建一个Model.php文件作为模型类,代码如下:
实例
<?php //模型类 class Model{ public function getData(){ return [ ['id'=>1, 'name'=>'张三','sex'=>'男','age'=>18], ['id'=>2, 'name'=>'李四','sex'=>'男','age'=>46], ['id'=>3, 'name'=>'王五','sex'=>'女','age'=>29], ]; } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
新建一个文件View.php作为视图类,代码如下:
实例
<?php //视图:渲染数据 class View{ public function fetch($data){ $info =''; foreach($data as $v){ $info .= '账号ID:'.$v['id'].',姓名:'.$v['name'].',性别:'.$v['sex'].',年龄:'.$v['age'].'<br>'; } return $info; } }
运行实例 »
点击 "运行实例" 按钮查看在线实例
新建文件index.php加载前面两个类:
实例
<?php //加载模型类 require 'Model.php'; //加载视图类 require 'View.php'; class Controller{ public function index(Model $model,View $view){ // 1. 获取数据 $data=$model->getData(); //2.渲染数据 return $view->fetch($data); } } // 客户端调用控制器 // 将模型与视图的实例化过程 放在控制器的外部实现 $model=new Model(); $view=new View(); // 将Model和View的类实例, 做为参数,注入到控制器的方法中 // 这就叫:依赖注入 echo (new Controller())->index($model,$view);
运行实例 »
点击 "运行实例" 按钮查看在线实例
运行后效果如图所示:
2. 写一个mvc应用的案例, 内容自定义。
实例
<?php //模型类 class Model{ public function getData(){ return 'MVC案例演示'; } } //视图类 class View{ public function fetch($data){ return '<h1>'.$data.'</h1>'; } } // 创建服务器容器: 对象管理器 class Container{ //创建容器池/数组 protected $instance=[]; // 实现类实例的实例化,并保存到一个数组中 public function bind($alias,Closure $process){ // 将类的实例化过程绑定/存入到容器中 $this->instance[$alias]=$process; } // 将类实例取出来 public function make($alias,$params=[]){ 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(); }); // 控制器 class Controller { // 将容器对象注入到index() public function index(Container $container) { // 1. 获取数据 $data = $container->make('model')->getData(); // 2. 渲染模板/视图 return $container->make('view')->fetch($data); } } // 客户端调用控制器 $controler = new Controller(); echo $controler->index($container);
运行实例 »
点击 "运行实例" 按钮查看在线实例
运行后效果如图所示:
3. 写一个简单的路由, 理解路由的原理与目标。
实例
<?php $uri=$_SERVER['REQUEST_URI']; echo $uri; $req=explode('/',$uri); echo '<pre>'.print_r($req,true); $route=array_slice($req,3,3); echo '<pre>'.print_r($route,true); list($module, $controller, $action) = $route; echo '模块: '.$module.'<br>控制器: '.$controller. '<br>操作: '. $action; $valus = array_slice($req, 6, 6); echo '<pre>'. print_r($valus, true); for($i=0;$i<count($valus);$i+=2){ $params[$valus[$i]]=$valus[$i+1]; } echo '<pre>'.print_r($params,true); class Index{ public function add($name,$sex,$age){ return '姓名:'.$name.'性别:'.$sex.'年龄:'.$age; } } // 路由的目标, 就是将URL中的操作映射到控制器中的方法上 echo call_user_func_array([(new Index()),'add'],$params);
运行实例 »
点击 "运行实例" 按钮查看在线实例
运行后效果如图所示: