博客列表 >PHP学习总结(17)MVC与路由的实例分析——2019年10月11日20:00分

PHP学习总结(17)MVC与路由的实例分析——2019年10月11日20:00分

虎子爸爸
虎子爸爸原创
2019年10月16日 00:42:161097浏览

第一部分  mvc案例与依赖注入案例

运行效果图:

class-12.png

目录图:

class-13.png

模型类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);

?>

运行实例 »

点击 "运行实例" 按钮查看在线实例

总结:这样对前面学的框架更清楚了!

第二部分:路由原理与目标

class-14.png

实例

<?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()用处真不少!






声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议