亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

實(shí)例詳解怎么用PHP實(shí)現(xiàn)簡(jiǎn)易的MVC框架

WBOY
發(fā)布: 2022-05-13 11:47:50
轉(zhuǎn)載
6751人瀏覽過(guò)

本篇文章給大家?guī)?lái)了關(guān)于php的相關(guān)知識(shí),其中主要介紹了關(guān)于怎么用php實(shí)現(xiàn)簡(jiǎn)易的mvc框架的相關(guān)問題,包括了框架結(jié)構(gòu)簡(jiǎn)介以及框架實(shí)現(xiàn)等內(nèi)容,下面一起來(lái)看一下,希望對(duì)大家有幫助。

實(shí)例詳解怎么用PHP實(shí)現(xiàn)簡(jiǎn)易的MVC框架

推薦學(xué)習(xí):《PHP視頻教程

一、前言

MVC的全名是Model View Controller,是一種使用模型-視圖-控制器設(shè)計(jì)和創(chuàng)建web應(yīng)用程序的模式,是一種設(shè)計(jì)典范。

其中:

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

  • Model(模型):是應(yīng)用程序中用于處理應(yīng)用程序數(shù)據(jù)邏輯的部分,通常負(fù)責(zé)與數(shù)據(jù)庫(kù)直接進(jìn)行 curd 的交互。

  • View(視圖):是應(yīng)用程序處理數(shù)據(jù)顯示的部分,通過(guò)將處理好的數(shù)據(jù)進(jìn)行渲染。

  • Controller(控制器):是應(yīng)用程序中處理用戶交互的部分,通常用于處理數(shù)據(jù)邏輯的分發(fā),并相應(yīng)的反送給視圖和控制器。

優(yōu)點(diǎn):

  • 低耦合
  • 重用性高
  • 部署快,生命周期成本低
  • 可維護(hù)性高

缺點(diǎn):

  • 增加了系統(tǒng)結(jié)構(gòu)和實(shí)現(xiàn)的復(fù)雜性
  • 視圖與控制器間的過(guò)于緊密的連接

二、哪些框架使用到了mvc架構(gòu)?

目前現(xiàn)在php主流的框架都已經(jīng)用到了mvc架構(gòu),例如:

thinkPHP、Laravel、Yii 都有mvc的架構(gòu)。

三、框架結(jié)構(gòu)簡(jiǎn)介

在這里插入圖片描述
其中:

  • app目錄:用來(lái)存放視圖控制器模型等。
  • config目錄:用來(lái)存放框架的一些公共配置文件。
  • core目錄:用來(lái)存放一些基類文件,例如:控制器基類、模型基類、視圖基類、request請(qǐng)求基類、db鏈?zhǔn)讲僮骰惖取?/li>
  • static目錄:用來(lái)存放一些靜態(tài)資源,例如:圖片、html視圖文件、js、cs文件等。
  • index.php:整個(gè)框架的入口文件,進(jìn)行分發(fā)啟動(dòng)。

四、框架實(shí)現(xiàn)第一步(解析路由)

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

只有成功解析路由以后,訪問到了某個(gè)類中的某個(gè)方法才可以使用MVC,因?yàn)榻馕雎酚梢彩强蚣軐?shí)現(xiàn)的最基礎(chǔ)的一部分,解析路由也少不了PHP的自動(dòng)加載機(jī)制

目前的php的自動(dòng)加載機(jī)制可以分為兩大機(jī)制,composer自動(dòng)加載機(jī)制和手動(dòng)實(shí)現(xiàn)自動(dòng)加載機(jī)制,該簡(jiǎn)易框架通過(guò)手動(dòng)實(shí)現(xiàn)自動(dòng)機(jī)制來(lái)完成。

4.1 寫入口文件

index.php:

<?php//定義應(yīng)用目錄const APP_PATH = __DIR__ . '/';
//加載框架核心文件require(APP_PATH . 'core/Core.php');
//實(shí)例化框架類并運(yùn)行(new coreCore())->run();
登錄后復(fù)制

代碼詳解:

第一步,定義了常量用來(lái)定義應(yīng)用目錄,后期可能會(huì)在某個(gè)地方就會(huì)用到。
第二步,加載框架核心文件 Core.php ,主要的核心邏輯也都集中在這個(gè)文件中。
第三步,實(shí)例化該類,并調(diào)用該類的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{
            //走默認(rèn)控制器
            $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;
        }
    }}
登錄后復(fù)制

首先調(diào)用的是該類的 run 方法,run 方法主要負(fù)責(zé)調(diào)用運(yùn)行框架所需要 的一些方法,首先注冊(cè)了自動(dòng)加載方法 loadClass,其后調(diào)用了的解析路由的方法(這兒是重點(diǎn),這兒實(shí)現(xiàn)了地址欄上輸入接口地址直接訪問控制器)。

注意:路由的解析規(guī)則是由我們自己來(lái)進(jìn)行定義的。

代碼詳解:

第一步:注冊(cè)自動(dòng)加載類,目的是為了路由解析、命名空間所使用。
第二步:調(diào)用路由解析方法,把地址欄上輸入的 域名/控制器名/方法名 給解析出來(lái),并進(jìn)行調(diào)用。

經(jīng)過(guò)一系列解析后,最終 new 類名,調(diào)用方法名,來(lái)實(shí)現(xiàn)了路由的成功解析,從而訪問了某個(gè)類下面的某個(gè)方法。

$dispatch = new $controller($controllerName, $actionName);$dispatch->$actionName();
登錄后復(fù)制

例如,要訪問appcontrollersStudentController.php文件下的 demo 方法:

<?phpnamespace appcontrollers;use coreaseController;class StudentController extends Controller{
    public function demo()
    {
        echo '寫代碼的光頭強(qiáng)';
    }}
登錄后復(fù)制

在這里插入圖片描述

五、框架實(shí)現(xiàn)第二步(MVC的實(shí)現(xiàn))

通過(guò)第一步已經(jīng)完成了地址欄輸入路徑訪問到某個(gè)控制器中了,下面就需要在控制器中進(jìn)行 MVC 操作了。

5.1 控制器的實(shí)現(xiàn)

控制器本身是已經(jīng)實(shí)現(xiàn)的,但是我們需要去繼承一個(gè)控制器基類在里面實(shí)現(xiàn)一些操作,例如:注冊(cè)一些全局異常類、注冊(cè)一些請(qǐng)求類、控制器之間的互相調(diào)用等。

5.2 視圖的實(shí)現(xiàn)

視圖基類文件寫到了 core/base/View.php 文件里:

<?phpnamespace corease;/**
 * 視圖基類
 */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();
        }

    }}
登錄后復(fù)制

代碼詳解:

其中,視圖功能有兩大功能。

第一大功能:傳值(assign)

我們一般傳值都是通過(guò)

$this->assign('name','寫代碼的光頭強(qiáng)');$this->assign('sex','男');
登錄后復(fù)制

這種方法進(jìn)行傳值。

在框架中實(shí)現(xiàn)的方法為:

public function assign($name, $value){
   $this->variables[$name] = $value;}
登錄后復(fù)制

很明顯的可以看出,將所有的鍵值對(duì)放到了一個(gè)數(shù)組中。

第二大功能:視圖映射(render)

實(shí)現(xiàn)代碼:

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';
   }}
登錄后復(fù)制

接收到控制器名方法名,拼接到自定義視圖解析規(guī)則地址上,直接引入即可。

5.3 模型的實(shí)現(xiàn)

實(shí)現(xiàn)模型的靈魂就是要控制器名作為表名來(lái)使用。

控制器中:

$data = ['name' => 'tom'];$model = new StudentModel();$model->addData($data);
登錄后復(fù)制

自定義的模型中:

<?phpnamespace appmodels;use coreaseModel;class StudentModel extends Model{
    protected $table = 'student';

    public function addData($data)
    {
        $this->add($data);
    }}
登錄后復(fù)制

模型基類:

<?phpnamespace corease;use coredbOrm;class Model extends Orm{
    protected $table;
    public function __construct()
    {
        echo $this->table;
    }

    public function add($data){
        //處理添加邏輯
    }}
登錄后復(fù)制

在模型基類中我們可以自定義orm來(lái)完成與數(shù)據(jù)庫(kù)的交互操作

以上只是介紹了最簡(jiǎn)易的MVC實(shí)現(xiàn)案例,實(shí)現(xiàn)MVC框架沒有固定的實(shí)現(xiàn)方法,根據(jù)框架特色和語(yǔ)言特點(diǎn)以及自己的需求進(jìn)行實(shí)現(xiàn)即可。

推薦學(xué)習(xí):《PHP視頻教程

以上就是實(shí)例詳解怎么用PHP實(shí)現(xiàn)簡(jiǎn)易的MVC框架的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!

PHP速學(xué)教程(入門到精通)
PHP速學(xué)教程(入門到精通)

PHP怎么學(xué)習(xí)?PHP怎么入門?PHP在哪學(xué)?PHP怎么學(xué)才快?不用擔(dān)心,這里為大家提供了PHP速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來(lái)源:CSDN網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn
最新問題
開源免費(fèi)商場(chǎng)系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長(zhǎng)!
關(guān)注服務(wù)號(hào) 技術(shù)交流群
PHP中文網(wǎng)訂閱號(hào)
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時(shí)隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號(hào)
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)