批改状态:合格
老师批语:这个函数用处好大的, 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()用处真不少!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号