Blogger Information
Blog 40
fans 0
comment 0
visits 37565
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP学习总结(17)MVC与路由的实例分析——2019年10月11日20:00分
虎子爸爸
Original
1098 people have browsed it

第一部分  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()用处真不少!






Correction status:qualified

Teacher's comments:这个函数用处好大的, js中也有类似的, 函数一定要多学, 每掌握一个函数 , 就相当于你又多了一件杀敌的兵器, 又多学了一门独门的武功
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post