PHP的MVC框架 深入解析
建立3个文件夹
controller文件夹存放控制器文件
view文件夹存放视图文件
model文件夹存放数据文件
建立1个index.php 作为唯一入口
二、控制器
我们在controller文件夹下建立一个democontroller.php文件,文件内容如下
- <?php
- class DemoController
- {
- function index()
- {
- echo('hello world');
- }
- }
- /* End of file democontroller.php */
这个文件里面我们只是建立了一个名为DemoController的对象并包含一个index的方法,该方法输出hello world。下面在index.php中执行DemoController中index方法。
index.php的代码如下
- <?php
- require('controller/democontroller.php');
- $controller=new DemoController();
- $controller->index();
- /* End of file index.php */
运行index.php,ok如愿我们看到了我们久违的hello world。这两个文件非常简单,但也揭示了一点点mvc的本质,通过唯一入口运行我们要运行的控制器。当然controller部分应该是由uri来决定的,那么我们来改写一下index.php使他能通过uri来决定运行那个controller。
index.php改写代码如下:
- <?php
- $c_str=$_GET['c'];
- //获取要运行的controller
- $c_name=$c_str.'Controller';
- //按照约定url中获取的controller名字不包含Controller,此处补齐。
- $c_path='controller/'.$c_name.'.php';
- //按照约定controller文件要建立在controller文件夹下,类名要与文件名相同,且文件名要全部小写。
- $method=$_GET['a'];
- //获取要运行的action
- require($c_path);
- //加载controller文件
- $controller=new $c_name;
- //实例化controller文件
- $controller->$method();
- //运行该实例下的action
- /* End of file index.php */
在浏览器中输入http://localhost/index.php?c=demo&a=index,得到了我们的hello world。当然如果我们有其他的controller并且要运行它,只要修改url参数中的c和a的值就可以了。
这里有几个问题要说明一下。
一、php是动态语言,我们直接可以通过字符串new出我们想要的对象和运行我们想要的方法,即上面的new $c_name,我们可以理解成new 'DemoController',因为$c_name本身的值就是'DemoController',当然直接new 'DemoController'这么写是不行的,其中的'DemoController'字符串必须通过一个变量来中转一下。方法也是一样的。
二、我们在url中c的值是demo,也就是说$c_name 的值应该是demoController呀,php不是区分大小写吗,这样也能运行吗?php区分大小写这句话不完整,在php中只有变量(前面带$的)和常量(define定义的)是区分大小写的,而类名方,法名甚至一些关键字都是不区分大小写的。而true,false,null等只能全部大写或全部小写。当然我们最好在实际编码过程中区分大小写。
三、视图
我们在前面的controller中只是输出了一个“hello world”,并没有达到mvc的效果,下面我将在此基础上增加视图功能,相信到这里大家基本已经能想到如何添加视图功能了。对,就是通过万恶的require或者include来实现。
首先我们在view文件夹下建立一个index.php,随便写点什么(呵呵,我写的还是hello world)。之后我们改写一下我们之前的DemoController。代码如下:
- <?php
- class DemoController
- {
- function index()
- {
- require('view/index.php');
- }
- }
- /* End of file democontroller.php */
再在浏览器中运行一下,看看是不是已经输出了我们想要的内容了。
接着我们通过controller向view传递一些数据看看,代码如下:
- <?php
- class DemoController
- {
- function index()
- {
- $data['title']='First Title';
- $data['list']=array('A','B','C','D');
- require('view/index.php');
- }
- }
- /* End of file democontroller.php */
view文件夹下index.php文件代码如下:
- <html>
- <head>
- <title>demo</title>
- </head>
- <body>
- <h1><?php echo $data['title'];?></h1>
- <?php
- foreach ($data['list'] as $item)
- {
- echo $item.'<br>';
- }
- ?>
- </body>
- </html>
最后 MVC就是 Model View Controller 模型 视图 控制器
PHP的MVC框架 深入解析的更多相关文章
- asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析
下面我用一个实例来和大家分享一下我的经验,asp.net MVC 框架中控制器里使用Newtonsoft.Json对前端传过来的字符串进行解析. using Newtonsoft.Json; usin ...
- 在ASP.NET MVC 框架中调用 html文件及解析get请求中的参数值
在ASP.NET MVC 框架中调用 html文件: public ActionResult Index() { using (StreamReader sr = new StreamReader(P ...
- Spring 4 官方文档学习(十一)Web MVC 框架之resolving views 解析视图
接前面的Spring 4 官方文档学习(十一)Web MVC 框架,那篇太长,故另起一篇. 针对web应用的所有的MVC框架,都会提供一种呈现views的方式.Spring提供了view resolv ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)
前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)
前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- Spring MVC篇一、搭建Spring MVC框架
本项目旨在搭建一个简单的Spring MVC框架,了解Spring MVC的基础配置等内容. 一.项目结构 本项目使用idea intellij创建,配合maven管理.整体的目录结构如图: 其中ja ...
- Spring MVC 框架的架包分析,功能作用,优点
由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...
随机推荐
- mysql左外连接,右外连接,全连接
- Dev ComboxTree的实现
一个项目中刚好用到,自己做下笔记备份 顺便和大家共享下 需要用到ASPxDropDownEdit ASPxTreeView 这两个控件 ASPxDropDownEdit对应的dll为:DevExpre ...
- ANDROID_SDK_HOME设置
创建.删除和浏览AVD之前,通常应该先为Android SDk设置一个环境变量:ANDROID_SDK_HOME,该环境变量的值为磁盘上一个已有的路径.如果不设置环境变量,开发者创建的虚拟设备默认保存 ...
- php 5.3 配置mssql笔记
参考URL https://docs.moodle.org/29/en/Installing_MSSQL_for_PHP#Using_FreeTDS_on_Debian_Lenny 第一步,下载相应 ...
- O-c中类的继承与派生的概念
什么是继承 众所周知,面向对象的编程语言具有: 抽象性, 封装性, 继承性, 以及多态性 的特征. 那么什么是继承呢? 传统意义上是指从父辈那里获得父辈留下的东西 在开发中, 继承就是"复用 ...
- Oracle 10g 默认安装带来的用户名/密码
ORACLE数据库创建的时候,创建了一系列默认的用户和表空间 Oracle 10g 默认安装带来的用户名/密码 Username Password Description See Also CTXSY ...
- 学习笔记---C++析构函数心得
1.动态分配的对象的析构函数 class man{ public: man(){ cout<<"man begin"<<endl; }; ~man(){ c ...
- gitlab ActionView::Template::Error (undefined method `[]' for nil:NilClass): 500错误
Started GET "/mygroup/myproject/tree/master/MyDirectory" for 127.0.0.1 at 2014-10-22 22:42 ...
- Asp.net创建伪静态页面
下面是我研究了好几天和同事一起才研究出来的,原创. 1伪静态的定义: 伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息.或者还 ...
- css的box-sizing:border-box有什么用
css的box-sizing:border-box有什么用:视频说是多了的尺寸去掉了,适配box宽高