Correction status:qualified
Teacher's comments:这个函数用处好大的, js中也有类似的, 函数一定要多学, 每掌握一个函数 , 就相当于你又多了一件杀敌的兵器, 又多学了一门独门的武功
第一部分 mvc案例与依赖注入案例
运行效果图:
目录图:
模型类mvc\model\Index.php
<?php namespace mvc\model; // 模型类: 操作数据库 class Index{ public function getData() { return [ ['id'=>1, 'name'=>'苹果电脑','model'=>'MacBook Pro','price'=>25800], ['id'=>2, 'name'=>'一加手机','model'=>'Pro','price'=>4600], ['id'=>3, 'name'=>'小度同学','model'=>'AI音箱','price'=>199], ]; } } ?>
点击 "运行实例" 按钮查看在线实例
视图类mvc\view\Index.php
<?php // 视图类:渲染数据 namespace mvc\view; class Index{ public function fetch($data) { $table = '<table border="1" cellspacing="0" width="400">'; $table .= '<caption>商品信息表</caption>'; $table .= '<tr bgcolor="lightblue"><th>ID</th><th>品名</th><th>型号</th><th>价格</th></tr>'; foreach ($data as $product) { $table .= '<tr>'; $table .= '<td>' . $product['id'] . '</td>'; $table .= '<td>' . $product['name'] . '</td>'; $table .= '<td>' . $product['model'] . '</td>'; $table .= '<td>' . $product['price'] . '</td>'; $table .= '</tr>'; } $table .= '</table>'; return $table; } } ?>
点击 "运行实例" 按钮查看在线实例
控制类mvc\controller\index.php
<?php namespace mvc\controller; // 经典开发模型(思路),M数据库操作V视图C控制类, class Index{ protected $model = null; protected $view = null; public function __construct($model,$view){ $this->model = $model; $this->view = $view; } // 首页 public function index(){ // 通过模型类获取数据 $data = $this->model->getData(); //通过视图类渲染模板 return $this->view->fetch($data); } } ?>
点击 "运行实例" 按钮查看在线实例
自动加载liuphp\auto.php
<?php // 自动加载回调函数 /* 函数使用说明 目录名称和命名空间必须一致 文件名称和类名称必须要一致 */ spl_autoload_register( function ($className){ $url = "H:/phpstudy_pro/WWW/html.io/1012";//这里很关键 $path = str_replace('\\', DIRECTORY_SEPARATOR, $className); $path = $url .'/'. $path . '.php'; if (file_exists($path)) include $path; } );
点击 "运行实例" 按钮查看在线实例
入口文件index.php
<?php require ".\mvc\liuphp\auto.php"; echo __DIR__; $model = new \mvc\model\Index(); $view = new \mvc\view\Index(); $controller = new \mvc\controller\Index($model,$view); echo $controller->index($model,$view); ?>
点击 "运行实例" 按钮查看在线实例
总结:这样对前面学的框架更清楚了!
第二部分:路由原理与目标
<?php // 路由,就是把一个url映射到相应的类方法上去,比如有一个User类,然后有2个方法index(),info() class User{ public function info($name, $age, $salary){ return __METHOD__. ': 姓名: '.$name.', 年龄: '.$age. ', 工资: '. $salary; } public function index(){ echo "这是User类的首页"; } } // 然后我们一个地址url对应着User类的index方法,我们把这个url字符串分割成一个数组 $url_index = 'H:/phpstudy_pro/WWW/html.io/1012/route/user/index'; $res_index = explode('/',$url_index);//分割成一个数组 echo "<pre>".print_r($res_index,true)."</pre>"; echo "<br>"; $route_index = array_slice($res_index,5,3);//返回这个数组的特点部分,从第5个开始返回,返回3个 // $module 模块(文件名称) $controller控制类(类名称) $action类的方法 list($module,$controller,$action) = $route_index;//把数组重新赋值键名 //然后输出看看 echo '模块(文件名称): '.$module.'<br>控制器(类名称): '.$controller. '<br>操作(方法名称): '. $action; // 假如我们想映射到info方法,就需要带参数 $url_info = 'H:/phpstudy_pro/WWW/html.io/1012/route/user/info/name/liudebu/age/36/salary/9988'; // 继续分割 $res_info = explode('/',$url_info); //echo '<pre>'. print_r($res_info, true).'</pre>'; echo "<br>"; $route_info = array_slice($res_info, 8, 6); for ($i=0; $i<count($route_info); $i+=2) { $params[$route_info[$i]] = $route_info[$i+1]; } //把这个数组打印出来 echo '<pre>'. print_r($params, true).'</pre>'; //路由的目标, 就是将URL中的操作映射到控制器中的方法上 echo call_user_func_array([(new User()), 'info'], $params); echo "<br>";
点击 "运行实例" 按钮查看在线实例
总结:这个call_user_func_array()用处真不少!