• 技术文章 >后端开发 >php教程

    实例详解怎么用PHP实现简易的MVC框架

    长期闲置长期闲置2022-05-13 11:47:50转载2800
    本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于怎么用PHP实现简易的MVC框架的相关问题,包括了框架结构简介以及框架实现等内容,下面一起来看一下,希望对大家有帮助。

    推荐学习:《PHP视频教程

    一、前言

    MVC的全名是Model View Controller,是一种使用模型-视图-控制器设计和创建web应用程序的模式,是一种设计典范。

    其中:

    优点:

    缺点:

    二、哪些框架使用到了mvc架构?

    目前现在php主流的框架都已经用到了mvc架构,例如:

    thinkPHPLaravelYii 都有mvc的架构。

    三、框架结构简介

    在这里插入图片描述
    其中:

    四、框架实现第一步(解析路由)

    解析路由为什么是第一步呢?

    只有成功解析路由以后,访问到了某个类中的某个方法才可以使用MVC,因为解析路由也是框架实现的最基础的一部分,解析路由也少不了PHP的自动加载机制

    目前的php的自动加载机制可以分为两大机制,composer自动加载机制和手动实现自动加载机制,该简易框架通过手动实现自动机制来完成。

    4.1 写入口文件

    index.php

    <?php//定义应用目录const APP_PATH = __DIR__ . '/';
    //加载框架核心文件require(APP_PATH . 'core/Core.php');
    //实例化框架类并运行(new core\Core())->run();

    代码详解:

    第一步,定义了常量用来定义应用目录,后期可能会在某个地方就会用到。
    第二步,加载框架核心文件 Core.php ,主要的核心逻辑也都集中在这个文件中。
    第三步,实例化该类,并调用该类的run方法。

    4.2 定义Core核心类

    Core.php

    <?phpnamespace core;class Core{
        public function run()
        {
            spl_autoload_register(array($this, 'loadClass'));
            $this->route();
        }
    
        public function route()
        {
            $url = $_SERVER['REQUEST_URI'];
            $position = strpos($url, '?');
            $url = $position === false ? $url : substr($url, 0, $position);
            $url = trim($url, '/');
            if ($url)
            {
                //走URL指定控制器
                $urlArray = explode('/', $url);
                $controllerName = ucfirst($urlArray[count($urlArray)-2]);
                $actionName = $urlArray[1];
            }else{
                //走默认控制器
                $controllerName = 'Index';
                $actionName = 'index';
            }
            $versionUrlArr = explode('/',$url);
            $versionUrlArr = array_slice($versionUrlArr,0,-2);
            $versionStr = implode('\\',$versionUrlArr);
            if (empty($versionStr)){
                $versionStr = $versionStr;
            }else{
                $versionStr = $versionStr.'\\';
            }
            $controller = 'app\\controllers\\'.$versionStr. $controllerName . 'Controller';
            if (!class_exists($controller)) {
                exit($controller . '控制器不存在');
            }
            if (!method_exists($controller, $actionName)) {
                exit($actionName . '方法不存在');
            }
            $dispatch = new $controller($controllerName, $actionName);
            $dispatch->$actionName();
        }
        
        public function loadClass($className)
        {
            $className = str_replace('\\','/', $className);
            $file = $className . '.php';
            if (file_exists($file)){
                require_once $file;
            }
        }}

    首先调用的是该类的 run 方法,run 方法主要负责调用运行框架所需要 的一些方法,首先注册了自动加载方法 loadClass,其后调用了的解析路由的方法(这儿是重点,这儿实现了地址栏上输入接口地址直接访问控制器)。

    注意:路由的解析规则是由我们自己来进行定义的。

    代码详解:

    第一步:注册自动加载类,目的是为了路由解析、命名空间所使用。
    第二步:调用路由解析方法,把地址栏上输入的 域名/控制器名/方法名 给解析出来,并进行调用。

    经过一系列解析后,最终 new 类名,调用方法名,来实现了路由的成功解析,从而访问了某个类下面的某个方法。

    $dispatch = new $controller($controllerName, $actionName);$dispatch->$actionName();

    例如,要访问app\controllers\StudentController.php文件下的 demo 方法:

    <?phpnamespace app\controllers;use core\base\Controller;class StudentController extends Controller{
        public function demo()
        {
            echo '写代码的光头强';
        }}

    在这里插入图片描述

    五、框架实现第二步(MVC的实现)

    通过第一步已经完成了地址栏输入路径访问到某个控制器中了,下面就需要在控制器中进行 MVC 操作了。

    5.1 控制器的实现

    控制器本身是已经实现的,但是我们需要去继承一个控制器基类在里面实现一些操作,例如:注册一些全局异常类、注册一些请求类、控制器之间的互相调用等。

    5.2 视图的实现

    视图基类文件写到了 core/base/View.php 文件里:

    <?phpnamespace core\base;/**
     * 视图基类
     */class View{
        protected $variables = array();
        protected $_controller;
        protected $_action;
    
        function __construct($controller, $action)
        {
            $this->_controller = strtolower($controller);
            $this->_action = strtolower($action);
        }
    
        public function assign($name, $value)
        {
            $this->variables[$name] = $value;
        }
    
        public function render()
        {
            try {
                extract($this->variables);
                $file = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';
                if (file_exists($file)){
                    require_once $file;
                }else{
                    require_once APP_PATH.'core/errorpage/404.html';
                }
            }catch (\Exception $e){
                echo $e->getMessage();
            }
    
        }}

    代码详解:

    其中,视图功能有两大功能。

    第一大功能:传值(assign)

    我们一般传值都是通过

    $this->assign('name','写代码的光头强');$this->assign('sex','男');

    这种方法进行传值。

    在框架中实现的方法为:

    public function assign($name, $value){
       $this->variables[$name] = $value;}

    很明显的可以看出,将所有的键值对放到了一个数组中。

    第二大功能:视图映射(render)

    实现代码:

    public function render(){
       extract($this->variables);
       $file = APP_PATH . 'app/views/' . $this->_controller . '/' . $this->_action . '.php';
       if (file_exists($file)){
           require_once $file;
       }else{
           require_once APP_PATH.'core/errorpage/404.html';
       }}

    接收到控制器名方法名,拼接到自定义视图解析规则地址上,直接引入即可。

    5.3 模型的实现

    实现模型的灵魂就是要控制器名作为表名来使用。

    控制器中:

    $data = ['name' => 'tom'];$model = new StudentModel();$model->addData($data);

    自定义的模型中:

    <?phpnamespace app\models;use core\base\Model;class StudentModel extends Model{
        protected $table = 'student';
    
        public function addData($data)
        {
            $this->add($data);
        }}

    模型基类:

    <?phpnamespace core\base;use core\db\Orm;class Model extends Orm{
        protected $table;
        public function __construct()
        {
            echo $this->table;
        }
    
        public function add($data){
            //处理添加逻辑
        }}

    在模型基类中我们可以自定义orm来完成与数据库的交互操作

    以上只是介绍了最简易的MVC实现案例,实现MVC框架没有固定的实现方法,根据框架特色和语言特点以及自己的需求进行实现即可。

    推荐学习:《PHP视频教程

    以上就是实例详解怎么用PHP实现简易的MVC框架的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:CSDN,如有侵犯,请联系admin@php.cn删除
    专题推荐:php
    上一篇:消息队列RabbitMQ入门与PHP实例详解 下一篇:什么是php-fpm?如何进行优化来提升性能?
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• php怎么将二进制转为浮点型数• PHP 8.2 不再支持字符串中用${}插入变量了• php怎么将字符串转为数组(以空格为界)• php怎么判断数组元素是否是数字• 消息队列RabbitMQ入门与PHP实例详解
    1/1

    PHP中文网