ホームページ php教程 php手册 PHP实现MVC开发: 一个简单的MVC

PHP实现MVC开发: 一个简单的MVC

Jun 10, 2016 pm 03:06 PM
mvc php コード 成し遂げる オープンソース 単純 プログラミング プログラミング言語 ソフトウェア開発

今天研究了下PHP MVC结构,所以决定自己写个简单的MVC,以待以后有空再丰富。
至于什么MVC结构,其实就是三个Model,Contraller,View单词的简称,,Model,主要任务就是把数据库或者其他文件系统的数据按 照我们需要的方式读取出来。View,主要负责页面的,把数据以html的形式显示给用户。Controller,主要负责业务逻辑,根据用户的 Request进行请求的分配,比如说显示登陆界面,就需要调用一个控制器userController的方法loginAction来显示。
下面我们用PHP来创建一个简单的MVC结构系统。
首先创建单点入口,即bootstrap文件index.php,作为整个MVC系统的唯一入口。什么是单点入口呢?所谓单点入口就是整个应用程序只有一 个入口,所有的实现都通过这个入口来转发。为什么要做到单点入口呢?单点入口有几大好处:第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。 比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面。第二、程序的架构更加 清晰明了。当然好处还有很多的。:)

<?php <br>include("core/ini.php");<br>initializer::initialize();<br>$router = loader::load("router");<br>dispatcher::dispatch($router);<br>
ログイン後にコピー

这个文件就只有4句,我们现在一句句来分析。
include(”core/ini.php”);

我们来看core/ini.php

<?php <br>set_include_path(get_include_path() . PATH_SEPARATOR . "core/main");<br>//set_include_path — Sets the include_path configuration option<br>function __autoload($object){<br>  require_once("{$object}.php");<br>}<br>
ログイン後にコピー

这个文件首先设置了include_path,也就是我们如果要找包含的文件,告诉系统在这个目录下查找。其实我们定义__autoload()方法,这个方法是在PHP5增加的,就是当我们实例化一个函数的时候,如果本文件没有,就会自动去加载文件。官方的解释是:
Many developers writing object-oriented applications create one PHP source file per-class definition. One of the biggest annoyances is having to write a long list of needed includes at the beginning of each script (one for each class).

In PHP 5, this is no longer necessary. You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn’t been defined yet. By calling this function the scripting engine is given a last chance to load the class before PHP fails with an error.

接下来我们看下面一句
initializer::initialize();
这就话就是调用initializer类的一个静态函数initialize,因为我们在ini.php,设置了include_path,以及定义了__autoload,所以程序会自动在core/main目录查找initializer.php.
initializer.php文件如下:

<?php <br>class initializer<br>{<br>	public static function initialize()	{<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/main");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/main/cache");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/helpers");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "core/libraries");<br>		set_include_path(get_include_path().PATH_SEPARATOR . "app/controllers");<br>		set_include_path(get_include_path().PATH_SEPARATOR."app/models");<br>		set_include_path(get_include_path().PATH_SEPARATOR."app/views");<br>		//include_once("core/config/config.php");<br>	}<br>}<br>?><br>
ログイン後にコピー

这个函数很简单,就只定义了一个静态函数,initialize函数,这个函数就是设置include_path,这样,以后如果包含文件,或者__autoload,就会去这些目录下查找。

OK,我们继续,看第三句
$router = loader::load(”router”);

这句话也很简单,就是加载loader函数的静态函数load,下面我们来loader.php

<?php <br>class loader<br>{<br>  private static $loaded = array();<br>  public static function load($object){<br>    $valid = array(  "library",<br>	                    "view",<br>                            "model",<br>                            "helper",<br>                            "router",<br>                            "config",<br>                            "hook",<br>                            "cache",<br>                            "db");<br>    if (!in_array($object,$valid)){<br> 	  throw new Exception("Not a valid object '{$object}' to load");<br>    }<br>    if (empty(self::$loaded[$object])){<br>      self::$loaded[$object]= new $object();<br>    }<br>    return self::$loaded[$object];<br>  }<br>}<br>
ログイン後にコピー

这个文件就是去加载对象,因为以后我们可能会丰富这个MVC系统,会有model,helper,config等等的组件。如果加载的组件不在有效 的范围内,我们抛出一个异常。如果在的话,我们实例化一个对象,其实这里用了单件设计模式。也就是这个对象其实就只能是一个实例化对象,如果没有实例化, 创建一个,如果存在的,则不实例化。

好,因为我们现在要加载的是router组件,所以我们看下router.php文件,这个文件的作用就是映射URL,对URL进行解析。
router.php

<?php <br>class router<br>{<br>  private $route;<br>  private $controller;<br>  private $action;<br>  private $params;<br>  public function __construct()<br>  {<br>    $path = array_keys($_GET);<br>    if (!isset($path[0])){<br>      if (!empty($default_controller))<br>           $path[0] = $default_controller;<br>      else<br>           $path[0] = "index";<br>    }<br>    $route= $path[0];<br>    $this->route = $route;<br>    $routeParts = split( "/",$route);<br>    $this->controller=$routeParts[0];<br>    $this->action=isset($routeParts[1])? $routeParts[1]:"base";<br>    array_shift($routeParts);<br>    array_shift($routeParts);<br>    $this->params=$routeParts;<br>  }<br>  public function getAction() {<br>    if (empty($this->action)) $this->action="main";<br>    return $this->action;<br>  }<br>  public function getController()  {<br>    return $this->controller;<br>  }<br>  public function getParams()  {<br>    return $this->params;<br>  }<br>}<br>
ログイン後にコピー

我们可以看到,首先我们是拿到$_GET,用户Request的URL,然后从URL里我们解析出Controller和Action,以及Params
比如我们的地址是http://www.tinoweb.cn/user/profile/id/3
那么从上面的地址,我们可以拿到controller是user,action似乎profile,参数是id以及3

OK我们看最后一句,就是
dispatcher::dispatch($router);

这句话的意思很明了,就是拿到URL解析的结果,然后通过dispatcher来分发controlloer及action来Response给用户
好,我们来看下dispatcher.php文件

<br>class dispatcher<br>{<br>  public static function dispatch($router)<br>  {<br>    global $app;<br>    ob_start();<br>    $start = microtime(true);<br>    $controller = $router->getController();<br>    $action = $router->getAction();<br>    $params = $router->getParams();<br>    $controllerfile = "app/controllers/{$controller}.php";<br>    if (file_exists($controllerfile)){<br>      require_once($controllerfile);<br>      $app = new $controller();<br>      $app->setParams($params);<br>      $app->$action();<br>      if (isset($start)) echo "<br><br>Tota1l time for dispatching is : ".(microtime(true)-$start)." seconds.<br><br>";<br>      $output = ob_get_clean();<br>      echo $output;<br>     }else{<br>	throw new Exception("Controller not found");<br>     }<br>   }<br>}<br>
ログイン後にコピー

这个类很明显,就是拿到$router来,寻找文件中的controller和action来回应用户的请求。

OK,我们一个简单的,MVC结构,就这样,当然这里还不能算是一个很完整的MVC,因为这里还没有涉及到View和Model,有空我再这里丰富。

我们来写个Controller文件来测试下上面的这个系统。

我们在app/controllers/下创建一个user.php文件

//user.php<br><?php <br>class user<br>{<br>  function base()<br>  {<br>  }<br>  public function login()<br>  {<br>    echo 'login html page';<br>  }<br>  public function register()<br>  {<br>    echo 'register html page';<br>  }<br>  public function setParams($params){<br>	var_dump($params);<br>  }<br>}<br>
ログイン後にコピー

然后你可以在浏览器中输入http://localhost/index.php?user/register 或者 http://localhost/index.php?user/login来测试下。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Python による問題解決: 初心者プログラマーとして強力なソリューションをアンロックする Oct 11, 2024 pm 08:58 PM

Python は、問題解決の初心者に力を与えます。ユーザーフレンドリーな構文、広範なライブラリ、変数、条件文、ループによる効率的なコード開発などの機能を備えています。データの管理からプログラム フローの制御、反復的なタスクの実行まで、Python が提供します

コーディングの鍵: 初心者のための Python の力を解き放つ コーディングの鍵: 初心者のための Python の力を解き放つ Oct 11, 2024 pm 12:17 PM

Python は、学習の容易さと強力な機能により、初心者にとって理想的なプログラミング入門言語です。その基本は次のとおりです。 変数: データ (数値、文字列、リストなど) を保存するために使用されます。データ型: 変数内のデータの型 (整数、浮動小数点など) を定義します。演算子: 数学的な演算と比較に使用されます。制御フロー: コード実行のフロー (条件文、ループ) を制御します。

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

See all articles