目录
PHP高手之路(一) 1
一、框架概述 3
1、什么是框架 3
2、为什么要使用框架 3
3、PHP主流框架 3
4、MVC设计思想 3
5、什么是MVC 4
6、MVC中的三大关键词 4
7、软件设计思想发展史 4
二、ThinkPHP快速入门 4
1、ThinkPHP(TP)原理图 4
2、ThinkPHP源码下载 5
3、ThinkPHP项目部署 6
4、ThinkPHP自动生成 7
5、ThinkPHP核心源码分析 8
6、入门实例:通过TP访问数据库中的内容 10
三、ThinkPHP中的控制器 12
1、什么是控制器 12
2、定义控制器 12
3、错误处理 13
4、URL调度模式(四种URL调用方式) 14
1)普通模式 14
2)PATHINFO模式(默认模式) 14
3)Rewrite重写模式(五步走) 15
4)兼容模式 16
5、空操作 16
6、空控制器 17
7、划分前后台模块(Home、Admin) 19
8、URL大小写 20
9、页面跳转 20
10、页面重定向 22
四、ThinkPHP中的视图 22
1、什么是视图 22
2、ThinkPHP中视图的组成 22
3、模板文件定义 23
4、模板中变量的分隔符 23
5、模板赋值与模板输出 24
6、模板替换 25
五、综合案例——企业网站后台架构 27
1、设置虚拟主机 27
2、配置hosts文件 27
3、重启Apache服务器 27
4、创建工程在Zend软件中 27
5、复制ThinkPHP核心代码到项目目录中 27
6、创建index.php文件,编写代码如下: 27
7、划分前后台分组 27
8、实现后台登陆功能(载入login.html登陆模板) 28
9、定义登陆功能(功能实现) 29
10、定义后台主页(IndexController控制器) 30
一、框架概述
1、什么是框架
框架,即framework。其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。
2、为什么要使用框架
- 代码重用(提高开发效率)
- 合理分工
- 解决多人协作开发问题
3、PHP主流框架
1)重量级框架
- Zend Framework :出身豪门的Zend框架(官方框架)
- Yii :开发者华裔美国人(薛强,英文名:qiang),效率非常高
- Symfony :功能强大、架构非常棒
2)轻量级框架
- Codelgniter(CI):轻量级框架,整体架构精简,代码非常完善
- ThinkPHP :国人开发,免费且开源,文档齐全,中文注释,使用广泛
4、MVC设计思想
ThinkPHP框架是采用单一入口的MVC框架,MVC并不是一段现成的代码,而是一种软件的设计思想。
5、什么是MVC
MVC是施乐帕克研究中心 (Xerox PARC)在八十年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用。
MVC是一个设计模式,它强制性的使应用程序的输入、处理和输出分开。使用MVC应用程序被分成三个核心部件:模型、视图、控制器。
6、MVC中的三大关键词
控制器:Controller(接收用户请求、处理业务逻辑)
模型:Model(处理数据逻辑,与数据库处理相关功能)
视图:View(显示数据给用户请求)
7、软件设计思想发展史
1)混合式编程(HTML+PHP混合在一起)
路边摊(所有功能都是由一个人完成的)
2)模板引擎技术(强制把HTML与PHP代码相分离)
伉俪(夫妻)餐馆
老板娘(招待客人、收款)+厨师(炒菜)
3)MVC设计思想(视图+模型+控制器强制分离)
五星级酒店
大堂经理(招待客人)+服务员(视图)+厨师(模型:负责与数据库进行交互)
大堂经理:控制器(所有的用户请求都首先经过控制器)
厨师:模型(负责根据用户请求处理数据逻辑)
服务器:视图,把模型返回的数据,根据大堂经理的指令,传输数据给用户
到此整个MVC结构完成。
二、ThinkPHP快速入门
1、ThinkPHP(TP)原理图
ThinkPHP框架是采用单一入口的MVC框架,整体对外开发的只有一个index.php入口文件
用户请求àindex.php入口文件à初始化MVC框架à调用Controller控制器àModel模型àMySQLà返回数据给Model模型àModel模型返回数据给控制器à控制器调用视图显示模板à返回给入口文件
初始化MVC框架
定义常量、设置自动加载、实现请求分发
http://www.tp.com/index.php?m=Home(前台模块)&c=Public(登陆控制器)&a=login(登陆方法)
2、ThinkPHP源码下载
下载ThinkPHP3.2.3框架,使用TP3.2有一个前提:PHP版本必须大于等于5.3,因为在TP3.2中添加了命名空间。
下载完成后,如下图所示:
Application:项目应用目录,我们的编写的代码都是放置于此,名字可更改
Public:公共资源目录,主要用于存放images,css,javascript
ThinkPHP:TP框架的核心源代码
.htaccess:重写文件(rewrite重写文件)
index.php:项目入口文件
composer.json与README.md:说明文件
3、ThinkPHP项目部署
① 在Apache工作目录,创建一个文件夹如thinkphp作为项目目录
② 配置虚拟主机(Apache配置文件)
③ 设置hosts文件
④ 配置完成后,请重启Apache软件
⑤ 复制ThinkPHP文件夹到项目目录中
⑥ 在Zend工具中创建一个工程
⑦ 创建一个index.php入口文件,编写代码如下:
⑧ 通过http://www.tp.com(虚拟域名)访问项目的入口文件,如下图所示:
4、ThinkPHP自动生成
如上图,项目初始化完毕后,系统会自动生成Shop目录并生成以下结构:
1)Common:核心函数库,里面包含了整个模块(Home和Admin)需要使用的核心函数与配置文件
2)Home:项目的前台模块(里面包含了MVC、Common、Conf)
--Common:Home模块的核心函数库
--Conf:Home模块的配置文件
--Controller:Home模块的控制器
--Model:Home模块的模型
--View:Home模块的视图
3)RunTime:运行时目录(系统日志、数据库缓存、模板缓存都存放于此)
特别说明:生成目录完成后,我们发现每个目录下都会自动生成一个index.html文件,为什么呢?
答:默认虚拟主机,当访问不到相关文件时,系统会自动把文档目录呈现给用户,基于安全考虑,系统默认在每个目录下都生成了一个index.html文件。
5、ThinkPHP核心源码分析
问题1:为什么系统只要设置了APP_PATH常量就可以自动生成这么多文件呢?
答:主要是受到ThinkPHP文件夹下ThinkPHP.php初始化文件的影响
为什么系统会根据我们定义的目录名称生成相关目录主要是受到以上常量的影响,那么系统又是如何生成和加载相关文件的呢?
答:主要受到源代码中start方法的影响
ThinkPHP核心源码分析:
问题2:为什么我们访问index.php入口文件,系统会自动弹出笑脸图标,它具体是哪个文件呢?又是怎么执行的呢?
如果请求入口文件没有任何参数,系统默认访问Home(前台模块)下Controller文件夹下的IndexController.class.php类文件夹下的index操作方法。
问题3:为什么我们不填写任何参数,系统会自动访问IndexController控制器下的index方法呢?
答:受到ThinkPHP核心配置文件的影响,系统默认访问Home模块下的IndexController控制器下的index方法,此文件可以在ThinkPHP核心源代码中找到,路径如下:
打开Conf下面的convention.php文件(所有配置都在此文件中),特别注意:
以后我们用到的配置文件不要死记硬背(直接到此文件中复制即可)
以上问题,主要是由配置文件夹中的以下三个参数设置的:
问题4:如何使用配置文件呢?
① 在Shop目录下的Home模块下的Conf文件夹下创建config.php文件
② 在config.php中编写代码如下:
③ 再次访问,系统自动定义为到Index控制器下的hello方法中
6、入门实例:通过TP访问数据库中的内容
① 创建项目目录,如thinkphp
② 设置虚拟主机
③ 设置hosts文件夹
④ 重启Apache
⑤ 在Zend软件创建一个工程
⑥ 复制ThinkPHP到项目目录中
⑦ 创建index.php入口文件,编写代码如下:
运行请求虚拟域名,如下图所示,代表创建成功
⑧ 在Index控制器下调用模型显示数据
调用数据之前,首选要设置配置文件,链接数据库(Shop/Home/Conf/config.php)
编写调用模型代码:
运行效果:
这就是ThinkPHP框架,欲知后事,待下午分解。
三、ThinkPHP中的控制器
1、什么是控制器
控制器即C(Controller)缩写,其主要负责接收用户请求、处理业务逻辑
2、定义控制器
① 项目的定义位置:Home或Admin模块下的Controller文件夹下创建控制器
② 控制器的命名规则:控制器名称(首字母大写)+Controller+.class.php
如:Index控制器:IndexController.class.php
产品分类:CategoryController.class.php
产品管理:ProductController.class.php
文章管理:ArticleController.class.php
小技巧:我们后台有多少个功能模块就对应多少个控制器,每个控制器中大部分是4个功能(函数),增删改查。
③ 在Home模块下的Controller文件夹中创建Goods产品控制器
④ 访问形式(普通模式)
http://域名/index.php?m=Home&c=Goods&a=index
m:模块名称(Home或Admin)
c:控制器名称的缩写(如Index、Goods)
a:控制器相关方法(如index、add、edit、del方法)
3、错误处理
当我们访问某个页面时如果弹出以下界面,代表代码有错误。
以上代码虽然可以说明页面有错误,但是无法具体提示哪行代码出错,可以开启TP框架中的代码调试功能,基本语法:
在项目的index.php入口文件中,添加以下代码即可:
开启成功后,再次访问如下图所示:
无法加载控制器代表GoodsController.class.php页面肯定出错了
4、URL调度模式(四种URL调用方式)
1)普通模式
基本语法:
http://域名/index.php?m=模块名称&c=控制器名称&a=操作或方法名
m:模块名称(Home或Admin)
c:控制器名称,Controller关键词前面那个部分
a:控制中的相关操作或方法(函数)
例:http://www.tp.com/index.php?m=Home&c=Goods&a=index,经过系统初始化文件分发请求时,系统会自动定位到Home模块下的Controller文件夹下的GoodsController.class.php文件中的index方法(函数)。
使用普通模式有一个前提:必须在配置文件中开启普通模式
URL_MODEL => 0
2)PATHINFO模式(默认模式)
PATHINFO模式系统最搜索引擎最友好的一种URL的调度模式(SEO)
基本语法:
http://www.tp.com/index.php/模块名称/控制器名称/操作或方法名
例:http://www.tp.com/index.php/Admin/Public/login
以上地址经过初始化文件进行请求分发时,系统会自动定位到后台模块Admin下面的Controller文件夹下的PublicController控制器下的login方法(以上链接主要用于系统登陆)
使用普通模式有二个前提:
① 必须在配置文件中开启普通模式
URL_MODEL => 1,默认其值也是1
② 要求服务器支持PATHINFO
3)Rewrite重写模式(五步走)
基本语法:
① httpd.conf配置文件中加载了mod_rewrite.so模块
② AllowOverride None 将None改为 All(虚拟主机设置)
③ 确保URL_MODEL设置为2(在配置文件中)
④ 把下面的内容保存为.htaccess文件放到入口文件index.php的同级目录下(根目录)
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
⑤ 重启Apache服务器即可
4)兼容模式
基本语法:
http://域名/index.php?s=模块名称/控制器名称/操作或方法名称
例:http://www.tp.com/index.php?s=Admin/Goods/add
以上链接经过初始化文件自动分发到后台Admin模块下的Controller文件夹下的GoodsController.class.php文件夹下add方法中
使用兼容模式有一个前提:必须在配置文件中设置URL_MODEL=>3
5、空操作
在ThinkPHP框架中,如果访问一个不存在的操作时,系统会自动定位到当前控制器下的空操作中。
例1:访问一个存在的操作,如下图所示:
为了解决以上问题,可以定义一个空操作,基本语法:
class 控制器名称 extends Controller {
//定义空操作
public function _empty() {
//空操作方法
}
}
空操作在实际项目开发中有哪些作用呢?
① 定制错误页面
② 优化url链接
6、空控制器
在实际项目开发中,如果访问一个不存在的控制器时,系统会弹出以下错误:
如果遇到以上问题,可以使用空控制器来解决以上问题,基本语法:
空控制器也有两个功能:
① 定制错误页面(如404页面)
1)创建空控制器如上图所示
2)复制资源文件到根目录下的Public文件夹中
3)复制index.html模板页面到Home/View/Public文件夹下并改名为404.html
4)更改模板文件的路径
5)在空控制器的index方法中通过display方法调用404模板(功能与Smarty中的一样)
② 优化url链接(了解,详情参考手册)
7、划分前后台模块(Home、Admin)
① 在Shop(项目目录)中创建一个Admin文件夹作为后台目录
② 在Admin文件夹下创建MVC文件夹
③ 在Shop/Common/Conf文件夹中创建config.php作为项目的公用配置文件(主要针对前后台),里面封装了前后台模块常用的配置信息,如前后台模块划分、数据库配置、URL调度模式等等…
④ 定义后台登陆控制器PublicController.class.php(Admin/Controller文件夹下)
通过url调度模式访问后台登陆界面:http://www.tp.com/index.php/Admin/Public/login
8、URL大小写
在ThinkPHP框架中,其对URL的操作是严格区分大小写的,但是有时可能我们需要忽略大小写,就可以通过以下参数进行配置:
URL_CASE_INSENSITIVE => true (true代表忽略大小写false代表区分大小写)
特别说明:如果是Windows服务器其是不区分大小写的,但是Linux服务器严格区分。
9、页面跳转
在实际项目开发中经常需要使用页面跳转功能(登陆成功跳转、登陆失败跳转、增删改查成功或失败跳转),在ThinkPHP框架中,可以通过以下两个方法实现成功与失败跳转:
成功跳转:
在控制器中可以通过$this->success(msg,url,time);进行成功跳转
失败跳转:
在控制器中可以通过$this->error(msg,url,time);进行失败跳转
参数说明:
msg:输出提示信息
url:跳转链接(默认情况下,经常使用success或error在本控制器中跳转,直接写方法名即可,如果需要跨控制器跳转/模块名称/控制器/方法名)
time:等待时间,默认3s
success方法演示:
error方法演示:
两者方法可以实现跳转功能,但是两者的底层实现方式是不同的:
success:$_SERVER["HTTP_REFERER"]
error:javascript:history.back(-1);
特别说明:如果你不喜欢两个跳转界面,其是允许更改的,可以在配置文件中找到两个模板位置:
如果想更改,建议不要更改ThinkPHP文件夹中的核心代码,请到自定义配置文件中更改。
10、页面重定向
通过success发现运行发现,如果想跨控制器跳转,方式如下:
$this->success(‘登陆成功’,’/Admin/Index/index’,3);
但是以上方法过于冗余,有没有一个更简单的办法呢?
答:实际项目开发中,通常使用success或error进行本控制器跳转,如果需要跨控制器可以通过页面重定向,方式如下:
$this->redirect(“控制器名称/方法名”,array(‘id’=>2),3,”页面跳转中”);
参数说明:
第一个参数,跳转的url链接
第二个参数,就是要传递的参数
第三个参数,等待时间
第四个参数,输出提示信息
运行效果:
默认底层实现:header(‘Location:index.php’);
四、ThinkPHP中的视图
1、什么是视图
所谓的视图就是用户界面
2、ThinkPHP中视图的组成
1)View系统视图类
2)模板文件
View视图主要完成两件事
① 通过assign方法分配变量到模板文件
② 通过display方法显示输出模板文件
3、模板文件定义
在Shop(项目目录)里的模块目录(Home或Admin)下的View文件夹创建与控制器同名的文件夹,然后在里面放置模板文件,在系统调用display方法时,系统会自动到当前控制器的模板文件夹下寻找模板文件。
如我们需要访问Admin/Controller/PublicController.class.php中的login方法并载入模板:
其运行时会自动到./项目目录/模块目录/View/控制器名称/寻找与login方法同名的.html模板文件。
如我们访问如下控制器:
去在运行时会自动到./项目目录/Admin/View/Index文件夹下寻找index.html页面
4、模板中变量的分隔符
在实际开发中,我们可以通过assign方法分配变量到模板文件,然后通过左右分隔符进行显示输出,其标识符可以通过以下两个参数进行定制
- 'TMPL_L_DELIM'=>'{',
- 'TMPL_R_DELIM'=>'}',
默认如果不定义,则为花括号。
然后在模板页面可以通过如下方式进行访问:
5、模板赋值与模板输出
在ThinkPHP框架中,可以通过assign方法分配变量到模板文件
可以通过display方法显示输出模板文件
display方法主要用于显示输出模板文件,功能与Smarty类似,但是有几个地方不同:
display() : 到模板文件夹寻找与操作名同名的模板文件
display(‘操作名’) :到模板文件夹寻找操作名的模板文件
display(‘控制器名:操作名’)
display(‘show’,‘utf-8’, ‘text/xml’) (了解)
6、模板替换
在ThinkPHP框架中,其在模板里面内置很多特殊标记:如__PUBLIC__、__URL__,当系统进行模板渲染时(输出时),ThinkPHP会自动把这些标记替换成相应的内容,我们把这些标记就称之为模板替换标记。
重点掌握:__CONTROLLER__或__URL__ :获取当前控制器的URL地址
__MODULE__:获取模块的URL
__ACTION__:获取当前操作的URL
__PUBLIC__:获取根目录下的资源目录(Public)
特别说明:以上标记不是固定的,也可以自己去定义,只需要在配置文件夹中添加以下信息即可:
示例代码:
在模板中直接引用__ADMIN__即可。
五、综合案例——企业网站后台架构
1、设置虚拟主机
2、配置hosts文件
3、重启Apache服务器
4、创建工程在Zend软件中
5、复制ThinkPHP核心代码到项目目录中
6、创建index.php文件,编写代码如下:
直接通过URL调度模式访问
7、划分前后台分组
① 在项目目录Shop下面创建Admin文件夹
② 在文件夹下创建MVC文件夹
③ 在Shop/Common/Conf文件夹下创建config.php文件,实现划分项目前台后
8、实现后台登陆功能(载入login.html登陆模板)
① 在Admin/Controller文件夹下创建PublicController.class.php控制器,编写代码
② 复制后台模板资源文件(images/css/js)到Public资源目录(在根目录下创建)
③ 复制login.html页面到Shop/Admin/View/Public文件夹下
④ 更改login.html中的路径信息(images/css/js)
首先请定义一个模板标记
批量替换即可。
运行如下图所示:
9、定义登陆功能(功能实现)
① 在login.html页面,把表单设置action属性
系统默认提交到checkLogin方法中
② 在PublicController.class.php中定义checkLogin方法
10、定义后台主页(IndexController控制器)
① 在Shop/Admin/Controller文件夹下创建IndexController控制器
② 复制index.html与top.html/left.html/right.html到View视图的Index文件夹
③ 把index.html页面中的三个页面改成相关方法
④ 在控制器中定义top/left/right方法
⑤ 更改模板样式(路径)