0

0

MVC scheme with php implement

php中文网

php中文网

发布时间:2016-06-23 14:34:33

|

1036人浏览过

|

来源于php中文网

原创

http://www.phpe.net/articles/382.shtml

 

DreamStudio
DreamStudio

SD兄弟产品!AI 图像生成器

下载
MVC模式在网站架构中十分常见。它允许我们建立一个三层结构的应用程式,从代码中分离出有用的层,帮助设计师和开发者协同工作 以及提高我们维护和扩展既有程式的能力。


视图(View)

“视图”主要指我们送到Web浏览器的最终结果??比如我们的脚本生成的HTML。当说到 视图时,很多人想到的是模版,但是把模板方案叫做视图的正确性是值得怀疑的。

对视图来说,最重要的事情可能是它应该是“自我意识 (self aware)”的,视图被渲染(render)时,视图的元素能意识到自己在更大框架中的角色。

以XML为例,可以说XML 在被解析时,DOM API有着这样的认知??一个DOM树里的节点知道它在哪里和它包含了什么。 (当一个XML文档中的节点用SAX解析时只有当解析到该节点时它才有意义。)

绝大多数模板方案使用简单的过程语言和这样的模板标签:

<p>{some_text}</p> <p>{some_more_text}</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>



它们在文档中没有意义,它们代表的意义只是PHP将用其他的东西来替换它。

如果你同意这种对视图的松散描述,你也 就会同意绝大多数模板方案并没有有效的分离视图和模型。模板标签将被替换成什么存放在模型中。

在你实现视图时问自己几个问题:“全体视图 的替换容易吗?”“实现一个新视图要多久?” “能很容易的替换视图的描述语言吗?(比如在同一个视图中用SOAP文档替换HTML文档)”


模 型(Model)

模型代表了程序逻辑。(在企业级程序中经常称为业务层(business layer))

总 的来说,模型的任务是把原有数据转换成包含某些意义的数据,这些数据将被视图所显示。通常,模型将封装数据查询,可能通过一些抽象数据类(数据访问层)来 实现查询。举例说,你希望计算英国年度降雨量(只是为了给你自己找个好点的度假地),模型将接收十年中每天的降雨量,计算出平均值,再传递给视图。


控 制器(controller)

简单的说控制器是Web应用中进入的HTTP请求最先调用的一部分。它检查收到的请求,比如一些 GET变量,做出合适的反馈。在写出你的第一个控制器之前,你很难开始编写其他的PHP代码。最常见的用法是index.php中像switch语句的结 构:

<p> </p>              <p class="sycode">                      代码                  <p class="sycode">      <p class="sycode">        1  <? php   2  switch  ( $_GET [ ' viewpage ' ]) {     3      case   " news " :           4       $page = new  NewsRenderer;      5      break ;       6      case   " links " :           7       $page = new  LinksRenderer;       8      break ;       9      default :           10       $page = new  HomePageRenderer;     11       break ; } 12  $page -> display();  ?>      </p>     </p>              </p><p> </p>这段代码混用了面向过程和对象的代码,但是对于小的站点来说,这通常是最好的选择。虽然上边的代码还可以优化。控 制器实际上是用来触发模型的数据和视图元素之间的绑定的控件。例子这里是一个使用MVC模式的简 单例子。首先我们需要一个数据库访问类,它是一个普通类。



在它上边放上模型。



代码

 1  php
 2    /* *
 3   *  A simple class for querying MySQL  */
 4    class  DataAccess {
 5        /* *
 6       * Private
 7       * $db stores a database resource
 8        */
 9        var   $db ;
10        /* *
11       * Private
12       * $query stores a query resource
13        */
14        var   $query ;
15        //  Query resource
16       //! A constructor.
17        /* *
18       * Constucts a new DataAccess object
19       * @param $host string hostname for dbserver
20       * @param $user string dbserver user
21       * @param $pass string dbserver user password
22       * @param $db string database name
23        */
24        function  DataAccess ( $host , $user , $pass , $db ) {
25            $this -> db = mysql_pconnect ( $host , $user , $pass );
26            mysql_select_db ( $db , $this -> db);
27       }
28        // ! An accessor
29        /* *
30       * Fetches a query resources and stores it in a local member
31       * @param $sql string the database query to run
32       * @return void
33        */
34        function  fetch( $sql ) {
35            $this -> query = mysql_unbuffered_query ( $sql , $this -> db); //  Perform query here
36       }
37        // ! An accessor
38        /* *
39       * Returns an associative array of a query row
40       * @return mixed
41        */
42        function  getRow () {
43            if  (  $row = mysql_fetch_array ( $this -> query , MYSQL_ASSOC) )
44                return   $row ;
45            else
46                return   false ;
47       }
48   }
49    ?>
50 

 

有一点要注意的是,在模型和数据访问类之间,它们的交互从不会多于一行??没有多行被传送,那样会很快使程式慢下来。同样的程式对 于使用模式的类,它只需要在内存中保留一行(Row)??其他的交给已保存的查询资源(query resource)??换句话说,我们让MYSQL替我们保持结果。

接下来是视图??我去掉了HTML以节省空间,你可以查看这篇文章的 完整代码。



代码

php
  /* *
 *  Binds product data to HTML rendering  */
  class  ProductView {
      /* *
     * Private
     * $model an instance of the ProductModel class
      */
      var   $model ;
      /* *
     * Private
     * $output rendered HTML is stored here for display
      */
      var   $output ;
      // ! A constructor.
      /* *
     * Constucts a new ProductView object
     * @param $model an instance of the ProductModel class
      */
      function  ProductView ( & $model ) {
          $this -> model =&   $model ;
     }
      // ! A manipulator
      /* *
     * Builds the top of an HTML page
     * @return void
      */  
     function   header  () {
     }
      // ! A manipulator
      /* *
     * Builds the bottom of an HTML page
     * @return void
      */
      function  footer () {
     }
      // ! A manipulator
      /* *
     * Displays a single product
     * @return void
      */
      function  productItem( $id = 1 ) {
          $this -> model -> listProduct( $id );
          while  (  $product = $this -> model -> getProduct() ) {
               //  Bind data to HTML
         }
     }
      // ! A manipulator
      /* *
     * Builds a product table
     * @return void
      */
      function  productTable( $rownum = 1 ) {
          $rowsperpage = ' 20 ' ;
          $this -> model -> listProducts( $rownum , $rowsperpage );
          while  (  $product = $this -> model -> getProduct() ) {
               //  Bind data to HTML
         }
     }      // ! An accessor
      /* *
     * Returns the rendered HTML
     * @return string      */
      function  display () {
          return   $this -> output;
     }
 }
  ?>

 

最后是控制器,我们将把视图实现为一个子类。






代码

 1  php
 2    /* *
 3   *  Controls the application
 4    */
 5    class  ProductController  extends  ProductView {
 6        // ! A constructor.
 7        /* *
 8       * Constucts a new ProductController object
 9       * @param $model an instance of the ProductModel class
10       * @param $getvars the incoming HTTP GET method variables
11        */
12        function  ProductController ( & $model , $getvars = null ) {
13           ProductView :: ProductView( $model );
14            $this -> header ();
15            switch  (  $getvars [ ' view ' ] ) {
16                case   " product " :
17                    $this -> productItem( $getvars [ ' id ' ]);
18                    break ;
19                default :
20                    if  (  empty  ( $getvars [ ' rownum ' ]) ) {
21                        $this -> productTable();
22                   }  else  {
23                        $this -> productTable( $getvars [ ' rownum ' ]);
24                   }                  break ;
25           }
26            $this -> footer();
27       }
28   }
29    ?>
30 

 

注意这不是实现MVC的唯一方式??比如你可以用控制器实现模型同时整合视图。这只是演示模式 的一种方法。

我们的index.php 文件看起来像这样:



代码

 1  php
 2    require_once ( ' lib/DataAccess.php ' );
 3    require_once ( ' lib/ProductModel.php ' );
 4    require_once ( ' lib/ProductView.php ' );
 5    require_once ( ' lib/ProductController.php ' );
 6    $dao =&   new  DataAccess ( ' localhost ' , ' user ' , ' pass ' , ' dbname ' );
 7    $productModel =&   new  ProductModel( $dao );
 8    $productController =&   new  ProductController( $productModel , $_GET );
 9    echo   $productController -> display();
10    ?>
11 

 

漂亮而简单。

我们有一些使用控制器的技巧,在PHP中你可以这样做:

              <p class="sycode">                  <p class="sycode">      1  $this -> { $_GET [ ' method ' ]}( $_GET [ ' param ' ]);     </p>              </p><p> </p>



一个建议是你最好定义程序URL的名字空间形式(namespace),那样它会比较规范比如:

              <p class="sycode">                  <p class="sycode">      1  " index.php?class=ProductView&method=productItem&id=4 "     </p>              </p><p> </p>



通过它我们可以这样处理我们的控制器:

              <p class="sycode">                  <p class="sycode">      1  $view = new   $_GET [ ' class ' ];  2  $view -> { $_GET [ ' method ' ]( $_GET [ ' id ' ]);     </p>              </p><p> </p>



有时候,建立控制器是件很困难的事情,比如当你在开发速度和适应性之间权衡时。一个获得灵感的好去处是Apache group 的Java Struts,它的控制器完全是由XML文档定义的。

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

89

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

276

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

59

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

99

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

105

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

230

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

619

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

173

2026.03.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号