PHP5中MVC结构学习

 新闻资讯     |      2019-11-19 02:12

一.介绍

现在在开发web运用的时分,比较盛行的一种做法便是运用“mvc”结构,运用如此办法去开发web运用程序,逻辑性强、简浩明晰,使程序规划起来愈加便利,便利。何为“mvc”呢?简略的来说,它便是“模型”、“视图”及“控制器”的结合体,也便是一切的“三层”笼统结构,当然这儿所说的“mvc”是针对web上运用而言的,“使代码和页面规划分隔”便是其主导思维,这一思维在运用java servlet/javaserver pages技能的“struts”中体现的酣畅淋漓,有爱好的能够去http://jakarta.apache.org/struts看看,这种规划形式使的程序规划人员能够专心于代码的规划、编写及调试,网页规划人员能够有更多的时刻去投入规划而不必理睬详细的功用完成,这种分工办法彻底习惯大型项目或企业级的分布式运用开发。

从php5的推出能够看到,其间的面向对象功用越来越完善,运用php来开发大型的商业网站或许分布式企业运用现已成为可能,假如再结合zend optimizer,现已完成了代码的封装性。

如安在php中运用“mvc”规划形式去开发web运用呢?记住一点,用一个简略的比方演示一下,比方要从数据库中查询出会员的材料以显现在网页上,这儿就需求考虑到两点:1.衔接数据库并取出会员材料,2.把会员材料显现在网页上,衔接数据库咱们运用一个数据库的类,把它叫做“db”类吧,这个类此刻就扮演了“模型”的人物,接着咱们需求编写一个操作“db”类的程序以取出数据,这个程序所扮演的人物便是“控制器”,它承受客户端“post”或“put”的数据,然后再调用“db”类以取出数据,把这些数据都寄存在“控制器”中,最终把数据传递给“视图”并依照必定的排版格局显现出来,从上面的剖析能够看出,模板在这儿便是扮演了“视图”的人物,当然只是一个模板类是不能说成是mvc的,真实的mvc不是这么简略的,详细能够参阅一下“jsf”。

“3t”是一个模板类,主要是读取“控制器”的数据并进行一些特别处理,最终经过一些简略的模板语法把数据显现出来,它具有一些什么样的特色呢?

解析速度快,能够依据需求挑选运用html办法缓存或php办法缓存,当然你也能够不必缓存,相同能够完成快速安稳的web运用

运用简略、装置操作便利,在数据的读取方面相似闻名模板类“smarty”,在数据显现方面即相似“php的语法”又相似“javabeans”

可扩展性好,你能够依据需求随时参加你想要的功用,由于它是开源的,在不久的日子里,将支撑插件功用

伸缩性好,支撑最新的php5,只需你的php版别 =4.0.6即可运用,当然你需求有在服务器操作文件的权限

功用强大,支撑模板的多级嵌套,数组多级循环等等

当然此模板还需完善的当地许多,有待在各种环境测验运用才干不断完善,现在仅在linux和windows环境下测验经过.

二.装置

1.解压后应该能够看到如下目录结构:

./3tx.x/cmp/ 编译后的文件
./3tx.x/tpl/ 模板文件
./3tx.x/che/ 缓存文件寄存的文件夹
./3tx.x/ttt/ttt.php 3t模板类文件
./3tx.x/ 程序文件

2.您的php版别不能低于php4.0.6,我主张你的php版别晋级至4.3.0以上,程序的全体功用将得到会大幅度进步

3.运转时如呈现变量未界说请在程序前加上"error_reporting;"函数

三.语法

模板简略语法阐明:
一般运用左面大括号"{"和右边大括号"}"作为模板语法的开端和完毕,当然也能够运用自界说的分隔符,如运用"["和"]",以下阐明以大括号为分隔符进行阐明



1.在模板文件中运用php代码,如:
[tplcode]
{php}
$i = 3;
echo $i;
{/php}
[/tplcode]
请参阅"example6"

2.在模板中运用foreach循环,如:


第一种用法....)
[/tplcode]
{foreach:$a,$k,$v}
$v = {$v} br
{/foreach}
[/tplcode]

第二种用法
[tplcode]
{foreach:$a,$k,$v,5}
$v = {$v} br
{/foreach}
[/tplcode]

第三种用法
[tplcode]
{foreach:$a,$k,$v,3,5}
$v = {$v} br
{/foreach}
[/tplcode]
请参阅"example1"和"example3",在"foreach"循环中能够运用多维数组,详细请看"example10"

3.在模板中运用if句子,如:

第一种用法
[tplcode]
{if:$a == "hello"}
变量$a的值是"hello"
{/if}
[/tplcode]

第二种用法
[tplcode]
{if:$a == true}
变量$a为真
{else}
变量$a不为真
{/if}
[/tplcode]

第三种用法
[tplcode]
{if:$a == 2}
变量$a的值为2
{elseif:$a == 3}
变量$a的值为3
{/if}
[/tplcode]
详细运用请参阅"example2"及"example6"

4.在模板中包括模板文件,如:
{tplcode}
{includetpl:head.tpl}
{/tplcode}
这儿包括了模板文件"head.tpl",所包括的模板文件必须在同一个目录下

5.在模板中包括php文件,如:
{tplcode}
{includephp:head.php}
{/tplcode}
这儿包括了php文件"head.php",文件"head.php"在当出息序目录下
包括文件请看"example8"

6.在模板中输出时刻,如:
{tplcode}
{date:y-m-d h:i:s}
{/tplcode}
后边的"y-m-d h:i:s"字符串是规范的php时刻标识,详细运用能够参阅php手册
详细运用请参阅"example7"

7.在模板中运用数学函数

第一种用法,直接输出成果
{tplcode}
{math:3*2-5}
{/tplcode}

第二种用法,赋值给指定变量
{tplcode}
{math:3*2-5,$result}
{/tplcode}

第三种用法,赋值给指定变量,第三个参数设置是否当即输出,设为"y"输出,"n"不输出
{tplcode}
{math:3*2-5,$result,y}
{/tplcode}
详细运用请参阅"example4"

8.在模板中运用for循环
如下代码所示
[tplcode]
{for:5,1000,1,$i}
{$i} br
{/for}
{/tplcode}
参数阐明:
5:表明从5开端循环
1000:表明循环到1000完毕
1:表明每次循环的增量为1,相当于$n++
$i:表明得到每次循环的值
"办法赋值的)
也参阅如下代码:
[tplcode]
{for:500,30,-2,$i}
从500开端循环,每次减2,直到30才完毕,当时循环的值是: b {$i} /b br
{/for}
{/tplcode}
详细运用请参阅"example2","example11"

9.在模板中运用email标签
第一种用法:
[tplcode]
{email:redhat@hnwj.net}
[/tplcode]
第二种用法:
[tplcode]
{email:redhat@hnwj.net,redhat的邮箱}
[/tplcode]
第三种用法:
[tplcode]
{email:redhat@hnwj.net,这是"redhat"的邮箱 -dh- 这个是带款式的 -dh- >[/tplcode]
详细运用请参阅"example5"

10.在模板中界说变量
[tplcode]
{assign:$tplvar,这是我界说的变量 -dh- 能够在模板中输出也可用php代码输出}
[/tplcode]
详细运用请参阅"example6".

11.其它语法及功用尚在开发中......
有好的定见或主意请去http://2002.buyionline.net/2002/gbook.php提一下吧,发现bug也请及时留言阐明一下,谢谢!



注:
1.本模板支撑多层嵌套的模板或php文件,支撑多层foreach或for循环
2.实际运用技巧
在实际运用过程中假如把特点$cmpcheck设置为true则每次运转都会编译php程序,不然程序会依据编译后的php文件的存在时刻长短判别是否要从头编译
该特点默值即为true,一般在正在运用中才设为false
设置办法如:$tttobj- setcmpcheck;
3.本程序最大的缺陷便是不能精确的捕捉程序中呈现的语法过错信息
4.暂不支撑缓存功用,假如你有好的主意无妨告诉我:-)
5.由于选用的是混编形式编译模板为php文件,所以请不要输错了,如输入"{foreach:$data,k,$v}"编译将经过,但运转的时分会导致一个语法过错,由于里边的"k"前面少了一个"$"符号.原本现已写好了对每一行进行语法剖析捕捉过错的代码,但发现代码到达几百行的时分占用时刻比较长,假如代码比较少还能够,但假如较多的话会导致功用的下降.并且php自身就有很不错的犯错信息提示,后来想想就没有去进行每行代码的剖析了.
6.不知我们是否留意到,在以上的标识中,参数都是不带引号或双引号的,期望留意哦:-)

四.运用

1.树立php文件,内容如下:
?php
require_once "./ttt/ttt.php";//引进类文件
$ttt = new ttt;//初始化3t模板类的实例
$ttt- settpldir;//需求编译的模板文件寄存目录
$ttt- setcmpdir;//编译后文件的寄存目录
$ttt- assign;//设置变量
$ttt- assign;//设置变量
$ttt- assign;//设置变量
$ttt- display;//输出
?

2.树立tpl文件.内容如下:

!doctype html public "-//w3c//dtd html 4.0 transitional//en"
html
head
meta http-equiv="content-type" content="text/html; charset=gb2312"
title {$title} /title
/head
body
{$content} br
br
{$foot}
/body
/html

3.在阅读器阅读http://domain/path/to/3tvx.x/3t/first.php即可看到成果,当然你先要把php的运转环境装备好.
4.更多比方请看程序自带的"example"系列...
五.类特点
$tpldir:string,"./tpl/"
模板文件的目录,需求加载的模板就从此处加载

$cmpdir:string,"./cmp/"
编译后的php文件寄存目录

$chedir:string,"./che/"

$tplfile:string,""
模板文件,所要解析的模板主文件

$startleft:string,"{"
模板变量的左面界符号,能够自己经过setleft办法去设置

$startright:string,"}"
模板变量的右鸿沟符号,能够自己经过setright办法去设置


六.类办法
ttt
类结构器,能够在此直接设置需求解析的模板,如:$obj- ttt;

setleft
设置模板变量"$startleft"的左面界,该变量默以为"{"

setright
设置模板变量"$startright"的左面界,该变量默以为"{"

settpldir
设置模板的寄存途径,此办法的同名办法是"settemplatesfile"

setcmpdir
设置模板编译后的寄存途径,此办法的同名办法是"setcompilesfile"

setchefile
设置缓存的模板文件目录,此办法的同名办法是"setcachesfile"

setcachefilter
当运用了模板的缓存功用时,运用此办法设置的文件将不被缓存处理

setwordsfilter
设置不宜在网站上显现的字符或字符串,如:$ttt- setwordsfilter;,把网页中的一切"abc"替换成"xyz";

setwordsfile
当设置了不宜在网站上显现的字符或字符串时,用此办法设置的文件中的字符或字符串将会不受"setwordsfilter"办法影响而直接显现

setquery
此办法只在运用了模板的缓存功用时才运用,主要是用来设置仅有的一串字符以使缓存文件不会重复,假如没有设置的话模板也会主动获取但会使程序变的不安全,只需不断的向程序get不同的参数变会一向生成不同的缓存文件,n时刻后,我想你服务器的硬盘就没空间了,当然这些只要在你运用了缓存功用并没有运用此办法设置仅有字符串所形成的,所以正确设置并在程序中处理一些get或post的值就显的很重要。能够像这样运用此办法"$ttt- setquery",这儿要留意当歹意用户提交不同的$tid或$sid时也会导致上述的进犯事情,所以必须在程序中捕捉到不合法的$tid和$sid并中止履行"$ttt- display"办法。

assign
设置在模板中要用到的变量,第一个参数为模板中要用到的变量,第二个参数为用户界说的值,如下:
$obj- assign;
$obj- assign);

display
输出解析后的模板,参数为要输出的模板文件名"现已设置过,在运用本办法时能够不必带参数)