国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
一、前言
二、哪些框架使用到了mvc架構(gòu)?
三、框架結(jié)構(gòu)簡(jiǎn)介
四、框架實(shí)現(xiàn)第一步(解析路由)
4.1 寫入口文件
4.2 定義Core核心類
五、框架實(shí)現(xiàn)第二步(MVC的實(shí)現(xiàn))
5.1 控制器的實(shí)現(xiàn)
5.2 視圖的實(shí)現(xiàn)
5.3 模型的實(shí)現(xiàn)
首頁(yè) 後端開發(fā) php教程 實(shí)例詳解怎麼用PHP實(shí)現(xiàn)簡(jiǎn)易的MVC框架

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

May 13, 2022 am 11:47 AM
php

本篇文章給大家?guī)砹岁P(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)容,下面一起來看一下,希望對(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ì)典范。

其中:

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

  • View(視圖):是應(yīng)用程序處理數(shù)據(jù)顯示的部分,通過將處理好的數(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ù)雜性
  • 視圖與控制器間的過于緊密的連接

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

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

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

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

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

  • app目錄:用來存放視圖控制器模型等。
  • config目錄:用來存放框架的一些公共配置文件。
  • core目錄:用來存放一些基類文件,例如:控制器基類、模型基類、視圖基類、request請(qǐng)求基類、db鏈?zhǔn)讲僮骰惖取?/li>
  • static目錄:用來存放一些靜態(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)易框架通過手動(dòng)實(shí)現(xiàn)自動(dòng)機(jī)制來完成。

4.1 寫入口文件

index.php

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

代碼詳解:

第一步,定義了常量用來定義應(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, &#39;loadClass&#39;));
        $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;
????????}
????}}

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

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

代碼詳解:

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

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

$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 &#39;寫代碼的光頭強(qiáng)&#39;;
    }}

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

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

通過第一步已經(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  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','寫代碼的光頭強(qiáng)');$this->assign('sex','男');

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

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

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

很明顯的可以看出,將所有的鍵值對(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';
???}}

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

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

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

控制器中:

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

自定義的模型中:

<?phpnamespace  app\models;use core\base\Model;class StudentModel extends Model{
    protected $table = &#39;student&#39;;

    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來完成與數(shù)據(jù)庫(kù)的交互操作

以上只是介紹了最簡(jiǎn)易的MVC實(shí)現(xiàn)案例,實(shí)現(xiàn)MVC框架沒有固定的實(shí)現(xiàn)方法,根據(jù)框架特色和語言特點(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)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

我如何了解最新的PHP開發(fā)和最佳實(shí)踐? 我如何了解最新的PHP開發(fā)和最佳實(shí)踐? Jun 23, 2025 am 12:56 AM

TostaycurrentwithPHPdevelopmentsandbestpractices,followkeynewssourceslikePHP.netandPHPWeekly,engagewithcommunitiesonforumsandconferences,keeptoolingupdatedandgraduallyadoptnewfeatures,andreadorcontributetoopensourceprojects.First,followreliablesource

什麼是PHP,為什麼它用於Web開發(fā)? 什麼是PHP,為什麼它用於Web開發(fā)? Jun 23, 2025 am 12:55 AM

PHPbecamepopularforwebdevelopmentduetoitseaseoflearning,seamlessintegrationwithHTML,widespreadhostingsupport,andalargeecosystemincludingframeworkslikeLaravelandCMSplatformslikeWordPress.Itexcelsinhandlingformsubmissions,managingusersessions,interacti

如何設(shè)置PHP時(shí)區(qū)? 如何設(shè)置PHP時(shí)區(qū)? Jun 25, 2025 am 01:00 AM

tosetTherightTimeZoneInphp,restate_default_timezone_set()functionAtthestArtofyourscriptWithavalIdidentIdentifiersuchas'america/new_york'.1.usedate_default_default_timezone_set_set()

我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? 我如何驗(yàn)證PHP中的用戶輸入以確保其符合某些標(biāo)準(zhǔn)? Jun 22, 2025 am 01:00 AM

TovalidateuserinputinPHP,usebuilt-invalidationfunctionslikefilter_var()andfilter_input(),applyregularexpressionsforcustomformatssuchasusernamesorphonenumbers,checkdatatypesfornumericvalueslikeageorprice,setlengthlimitsandtrimwhitespacetopreventlayout

什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? 什麼是php(serialize(),Unserialize())中的數(shù)據(jù)序列化? Jun 22, 2025 am 01:03 AM

thephpfunctionserize()andunSerialize()redustoconvertComplexdatStructDestoresToroStoroStoroSandaBackagagain.1.Serialize()

如何將PHP代碼嵌入HTML文件中? 如何將PHP代碼嵌入HTML文件中? Jun 22, 2025 am 01:00 AM

可以將PHP代碼嵌入HTML文件中,但需確保文件以.php為擴(kuò)展名,以便服務(wù)器能正確解析。使用標(biāo)準(zhǔn)的標(biāo)籤包裹PHP代碼,可在HTML中任意位置插入動(dòng)態(tài)內(nèi)容。此外,可在同一文件中多次切換PHP與HTML,實(shí)現(xiàn)條件渲染等動(dòng)態(tài)功能。務(wù)必注意服務(wù)器配置及語法正確性,避免因短標(biāo)籤、引號(hào)錯(cuò)誤或遺漏結(jié)束標(biāo)籤導(dǎo)致問題。

編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什麼? 編寫清潔和可維護(hù)的PHP代碼的最佳實(shí)踐是什麼? Jun 24, 2025 am 12:53 AM

寫乾淨(jìng)、易維護(hù)的PHP代碼關(guān)鍵在於清晰命名、遵循標(biāo)準(zhǔn)、合理結(jié)構(gòu)、善用註釋和可測(cè)試性。 1.使用明確的變量、函數(shù)和類名,如$userData和calculateTotalPrice();2.遵循PSR-12標(biāo)準(zhǔn)統(tǒng)一代碼風(fēng)格;3.按職責(zé)拆分代碼結(jié)構(gòu),使用MVC或Laravel式目錄組織;4.避免麵條式代碼,將邏輯拆分為單一職責(zé)的小函數(shù);5.在關(guān)鍵處添加註釋並撰寫接口文檔,明確參數(shù)、返回值和異常;6.提高可測(cè)試性,採(cǎi)用依賴注入、減少全局狀態(tài)和靜態(tài)方法。這些做法提升代碼質(zhì)量、協(xié)作效率和後期維護(hù)便利性。

如何使用PHP執(zhí)行SQL查詢? 如何使用PHP執(zhí)行SQL查詢? Jun 24, 2025 am 12:54 AM

Yes,youcanrunSQLqueriesusingPHP,andtheprocessinvolveschoosingadatabaseextension,connectingtothedatabase,executingqueriessafely,andclosingconnectionswhendone.Todothis,firstchoosebetweenMySQLiorPDO,withPDObeingmoreflexibleduetosupportingmultipledatabas

See all articles