




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目录:目录一.本文目标与声明二.phplib的概述三.phplib的基本功能介绍 四.phplib基本安装和使用五.如何使用phplib数据库驱动(一)六.如何使用phplib数据库驱动(二)七.如何使用phplib的Session功能八.使用phplib编程具体例子九.使用phplib编程具体例子(二)十.使用phplib编程具体例子(三)一.本文目标与声明 本文可以说是笔者用phplib进行开发的经验与技巧总结。在开发期间,本人用phplib和自己写的一些核心函数库和类,用很短时间就开发了很多高效而强大的程序工具,足以表明模块化面向对象编程的好处。 由于笔者使用phplib做开发的时间并不很长,而且程序本身很多高级的算法并没采用phplib,因此phplib的很多核心高级功能也没有完全使用。水平有限,所以如果出现任何的错误疏漏,请各位不吝赐教。 本文的目标是期望读者可以在短时间内熟悉phplib的基本功能,并能够利用它进行中小型程序,例如简单的新闻发布,数据查询,简单留言本和小论坛等。由于篇幅关系,phplib的一些高级应用本文并未提及,请各位原谅。声明:凡是参考本文章后如果出现任何错误或者失误,本人并不提供任何技术支持。 凡是发现本文的任何错误,请给笔者发email或者oicq告诉,帮助笔者完善本文档。 凡是与标准的phplib有出入的地方,请大家以标准phplib的为依据。二.phplib的概述 现在互联网上流行着很多优秀的嵌入式的脚本语言,例如perl,php,asp,jsp等。其中最流行的一种就是php,它以全部公开代码、开发容易、跨平台、功能强大以及支持数据库类型繁多等特点赢得了网上众多程序员的青睐。 而随着php的应用和推广,php的众多开发人员和很多爱好者在php的基础上开发了很多php的程序库,这些程 序库包括了大量的类、方法、变量和方法,能够处理复杂的web资源和提供强大的功能,大大简化了程序设计和提高了代码的可重用性。其中phplib就是这 些库中相当优秀的产品,它特别在数据库访问、数据库驱动以及访问认证和模板等方面具有很高的价值和实用性。用来开发大中型程序是相当适合的。 利用phplib可以非常轻易的开发出跨硬件、操作系统平台和数据库无关的 程序,其中很多优秀的程序都是采用了phplib来开发的。例如著名的phpslash就是一个例子。由于有了面向对象库和类的支持,数据库驱动都由类来 完成,因此写程序的时候基本上不需要考虑用的是什么数据库和如何驱动数据库,只需要懂得标准SQL语言就可以了。phpslash一旦安装好后就可以很好 的运行,提供优异的用户认证功能。即使在不支持session的php3下也可以很正常的使用session。并且它可以运行在nt或者unix平台下, 支持多达7种数据库而程序从一个平台或者系统转移到另外一个平台或者系统上的时候,程序行本身一个字也不需要改动。有关phplib的详细信息和文档可以到use.de 查找。三.phplib的基本功能介绍 phplib包含了很多功能,提供了众多的函数。然后根据笔者经验,觉得只要很好掌握其中的基本类和方法后,平时的工作几乎都不需要那些额外的高级类就可以完成了。 1.将数据库驱动和对数据库操作完全分离,这样的好处是对数据库的操作你需要的知识仅仅是SQL语言而不需要去估计各 个不同数据库间的函数不同,如果需要将程序移植的话,那么phplib的优势非常明显。需要修改的仅仅是数据库驱动文件,而程序行几乎都不需要修改任何一 行。如果是采用具体数据库函数操作的程序(例如用MySQL函数编写),那么移植起来几乎是等于重新编写。区别一看就知道了。 2.支持Session,这个功能可以创建一个受保护的页面。它可以广泛的应用 到需要进行登陆或者依靠帐号和权限来判别的程序。例如论坛、虚拟社区、新闻发布、用户管理、电子商务等。而且这个和纯粹的cookie不同,采用了 base_64的编码和解码。因此一般并不容易破译。为了加强安全性,用户可以自己编写自己的编码方式取代它原来的编码方式。 同时phplib还将每一个会话都保存到数据库中,因此可以通过查询数据库值得有多少用户在线上。 3. 权限许可(Perm),这个功能可以定义一系列具有不同级别和权限的用户。不需要编程人员额外地自己编写相应功能的代码就可以实现了分级管理和限制。同时 可以利用phplib中page/admin目录中的管理程序创建用户和修改相关信息。编程人员可以修改这些程序来服务自己的系统,节省了大量时间。4. 模板templete,和FastTemplete类似的是,phplib也有自己的模板功能类和文件。让用户可以方便的创建和修改html模板,并且将 php代码和html代码分离。便于让程序员和美工良好的合作。phplib的模板采用了定义标记和语法分析、模式匹配等技术,从而实现了和 FastTemplete类似的功能。编程人员可以根据实际的需要对这个功能代码进行修改以满足自己需求。5.购物车Cart,这个是个比较简易的购物车,各种物品和项目可以存放到车中,也可以被取出来,通过一些改造后也可以将这个功能做成电子商务中流行的购物系统的。 6.Html部件,在phplib中还有一些称为HTML Widgets的东西,可以方便地生成窗口/表格等。具体可以参考phplib手册。这里不再赘述。四.phplib基本安装和使用 要想使用phplib强大的功能,有几种途径可以达到目的。 1.采用phplib建议的安装方式,说安装,其实就是把phplib的类预先让解析器加载到内存,这样使用的时候就 不需要做任何设置,这样的好处显而易见。不过缺点也是很多的,如果程序按照这个方式直接引用phplib的函数的话,对于一些采用虚拟主机的用户来说,如 果ISP的服务器没有安装phplib的话,就不可以直接使用phplib了。所以这个方式的前提是:你的ISP支持phplib或者你有权限控制web 服务器,对于一般用户在自己机器上调试的话,这个方式比较好。详细做法这里不再赘述,只简单说个过程而已:a.下载phplib最新包,并解压好。b.将里面的php目录的内容放到一个安全的地方,例如/usr/local/phplib下 c.将这个目录的路径名添加到php3.ini/php.ini的include关键字段后include .:/usr/local/phplib 然后在找到auto_prepend_file关键字改成:auto_prepend_file = prepend.php3 重新启动一次web服务器,用phpinfo()函数检查包含路径和自动预加载参数,如果显示的值和刚才设定的一样的话就证明成功了。更加详细的安装/设定可以参考phplib的文档。 2. 包含的方式。这个方式就是比较麻烦,但是好处就是对于使用虚拟主机的用户来说,可以不需要ISP支持phplib就能享受phplib的功能。基本方法很 简单,可以在使用到phplib功能的程序最顶部加入相应的包含文件。不过要注意文件之间的相互依赖关系,下面是一个简单例子,它可以调用到基本的 MySQL数据库驱动功能和Session功能:$LIBDIR = /usr/local/phplib ;require($LIBDIR . db_mysql.inc); require($LIBDIR . ct_sql.inc);require($LIBDIR . session.inc); require($LIBDIR . local.inc); require($LIBDIR . page.inc);五.如何使用phplib数据库驱动(一) 第一部份:数据库连接/查询 a.四步曲:【ChinaByte 教程】1.要根据库中的DB_Sql来编写一个类,这个只需要在你的顶层包含文件中定义好就行了,同一个程序使用时不需要重定义,例子是:class slashDB extends DB_Sql var $classname=slashDB; /* Remember to change the below items to match your db */var $Host = localhost; var $Database = abc;var $User = abc;var $Password = abc; function halt($msg) printf(数据库出现错误!: %s n, $msg);printf(MySQL 错误!: %s (%s) n, $this-Errno, $this-Error);printf(请联系WebMaster并报告此出错信息得详细内容。n ); die(Session 挂起。); 其中slashDB的名字是任意的,根据编程者的喜好设定,不过都建议用extends语句生成的类的名字 最好都有DB两个字。例如userDB,slashDB。并且$classname要和class slashDB extends DB_Sql中 slashDB一样!否则类定义出错。其他需要修改的仅仅是类的名字,$classname,$Host,$Database ,$User,$Password等需要修改。函数halt是错误提示。你可以自定义到一个页面。 2.使用编写好的类的时候,用new关键字 $abc = new slashDB; 其中$abc是个变量名,这代表你要使用slashDB类的功能。3.查询数据库 一般有2个方法,短的查询直接将语句写到函数,长的就先用一个变量分别储存再查询。 a. 短语句:$abc-query(SELECT * FROM user WHERE username=kk AND passwd=kk ); 注意的是这里是一个调用slash类中的方法query,并且数据库查询语句不能漏了 ,否则出错。b.长语句 $q = SELECT username,passwd,email,nation,url,edulev;$q .= ,seclev FROM user WHERE username=$username ; $q .= AND aid=$aid ORDER BY ID DESC; $abc-query($q); /这里才执行查询采用了短语句合成长语句的方法。其中需要注意的是第一个$q是起始的语句,不能跟“.”号!接着同名的$q就是需要和第一个$q合成的变量,其实是同一个变量但是分别赋一个长语句的不同 部分。因为为了避免互相覆盖就用“.”号!切记切记! 另外查询语句中该有空格的必须有空格,即使该行没有,下一行也必须有。例如$q .= ,seclev FROM user WHERE username=$username ;句中最后有一个空格如果他没有,而接着的行开头没有的话,数据库查询会出错的。4.取得结果 $abc-next_record(); 这个是一个没有返回值的语句,他只会让Record;这个方法产生相应的查询 结果。如果没有这句话就不会产生相应的结果。next_record()是将当前指针向前移动并更新Record 、Error、Row、Errno的函数。因此不运行他一定不能够产生你需要的结果。$temail = $abc-Recordemail; $turl = $abc-Recordurl; 这几句就是将查询后的结果赋值给指定的变量。 注意:一般如果返回的row超过一行,你就要用习惯方法: while($abc-next_record() php代码 来进行处理了。这个方法就是便历了所有查询到的结果。六.如何使用phplib数据库驱动(二) 第二部份:数据库插入/删除 b. 插入/两步曲: 【ChinaByte 教程】1.创建一个调用类的变量 $add = new slashDB;2.进行数据库查询操作(实际上无论是SELECT还是INSERT等语句都是调用query方法和MySQL交互的)$add-query(INSERT INTO vars VALUES (a,b,c); 注意这里其实INSERT语句有很多写法,其中最多用的就是以下几种:(1).直接赋值:INSERT INTO 表名字 VALUES (值列表,用号包含,用,号分隔);例子:$add-query(INSERT INTO vars VALUES (a,b,c);(2).指定插入字段:INSERT INTO 表名字 (指定字段名字列表) VALUES (对应字段值);例子:$add-query(INSERT INTO vars (name,mail) VALUES (kk,kkk); 两者差别在于第一种必须给所有字段赋值,无论是空还是非空都要赋值,如果数据表有很多字段 而你开始只需要插入很少几个字段,那么就会浪费很多人力了。第一种适合于字段少的情况。第二种就是为了处理第一种的缺陷的。但是不适合于数据表字段少的情况。 删除/两步曲:1.创建一个调用类的变量$del = new slashDB;2.查询操作$del-query(DELETE FROM user WHERE username=kk AND passwd=kk); 一般这是删除某一条特定记录。如果要删除全部内容更加容易。只需要DELETE FROM 数据库表名字可以了。c.数据库内容更新更新/两步曲:1.创建一个调用类的变量 $update = new slashDB;2.查询操作 $q = UPDATE user SET username=$username,passwd=$pwd,email=$mail ; $q .= WHERE ID=$id AND DATE=$date; $update-query($q);这里UPAATE就没有什么特殊的格式,基本上都是UPDATE 数据库表 SET 字段名=字段值 判断条件(WHERE语句)。这个加入了WHERE语句是为了更新某一条特定的记录。 七.如何使用phplib的Session功能 基本的Session使用方法 【ChinaByte 教程】以下就是一个以用户登陆和注销为例子的Session使用例子,通过它你就会明白如何使用session以及Session是如何起作用的。你也会体会到使用了Phplib/Zsulib的好处和带来的便利。a.建立一个Session的类class slashSess extends Session var $classname = slashSess; / 和定义DB_Sql的道理一样var $magic = fkIsNotEqualToIK; / 随机化Session的字符串,建议用函数生成唯一串 var $mode = cookie; / 在GET模式时使用cookie var $lifetime = 86400; / session cookie的生存时间(单位:秒) var $that_class = slash_sql; / 要使用的目标数据库名字(一般情况并没用上)var $allowcache = no; / 是否使用缓冲?有3个选项:no/public/private 注意:其中slashSess这个名字可随便修改的,但是和定义 DB_Sql的extends一样要保证和$classname名字一样就可以了。其中这个定义了类slashSess的式子中,$magic的字串建议 使用随机函数产生独立的字串以避免重复。以下我给出一个小函数,以生成一个指定字长的独立随机串: /* function: unimagic() 版本:1.0 日期:2000/8/9 编写地:北京parameter: $length 需要产生的随机串的长度,默认是8位,最长32位 */function unimagic($length=8) srand(double)microtime()*1000000);$ran = rand();$md5 = md5($ran); $magic = substr($md5,0,$length); return $magic; b.使用Session功能 本部分配合例子Login.php来说明如何运用Phplib/Zsulib中session.inc文件中相关函数/类,这里分几个部分: 利用page_open函数打开一个类对应方法的数组; 注册提交的一些参数; 利用page_close函数关闭页面同时保存注册的信息; 释放注册的参数。结束一个Session会话。 这个小程序的流程(为了突出重点,这里尽量简化程序,多余的部分全部删除) 初始化页面-page_open调用Session(开始)-$op=login,注册提交参数 $op=logout,释放参数。1.初始化页面 这里需要用到两个类slashDB和slashSess;其中这两个类都在前面文档中提到。这两个类假定存放在config.php文件里。因此首先必须包含这个文件以便可以调用这两个类。/范例页面 ver 0.1 2000/8/24 /$ID:Login.php By hzqbbc in hp$/require config.php;/开始定义函数function display_login() 内容 function error_msg() 内容 /结束定义函数2.page_open调用Session开始 /调用page_open函数,其中slashSess是在config.php定义好的类 page_open(array(sess=slashSess);注意:尽量不要在page_open前require一些会产生html代码或者进行输出html代码的操作。否则会出现提示说已经发送了Header信息而不能再次发送的错误。 3.如果$op=login,进行登陆操作并注册信息:if ($op=login) if (isset($passwd) & isset($username) /判断用户名和密码是否空?否就继续 $sl_q = new slashDB;/调用类$q = SELECT seclev FROM user WHERE username=$username AND passwd=$passwd; $sl_q-query($q);/查询结果 /如果结果非空(意味着用户密码名字都正确)就继续if ($sl_q-next_record() $seclev = $sl_q-Recordseclev;/给$seclev赋值 /调用register函数,将所有需要记录的变量全部注册$sess-register(username); $sess-register(seclev);$sess-register(passwd); 4.如果$op=logout,进行注销信息操作 if ($op=logout) /调用delete函数删除注册的变量$sess-delete(); /删除后,对变量进行重新赋值并初始化成原始状态$seclev = 0; $passwd = ; $username = ; exit;echo 你已经注销了!; 5.结束本程序在结束前必须调用page_close();这样就完成了一个完整的Session会话。 如果已经执行了logout操作就不要执行了。所以完整语句是:if ($op!=logout) page_close(); 结束:一定要注意程序编写顺序,否则会产生逻辑错误。本例子就是一个最简单的用户登陆的模型所有采用Phplib的用户管理模式都和这个差不多。八.使用phplib编程具体例子 1.一些声明 关于本例子,本例子原来是为本协会(中山大学GNU/Linux协会)内部会员编写的,因此从比较长远的角度考虑 来编写,考虑比较多的是代码编写规范和习惯与算法。考虑到这些因素对编程也是很重要的,因此相关的章节与内容我并没有删除,如果读者觉得这部分没必要的话 请email通知笔者,谢谢。 2.代码的编写风格 这里讲的 不是如何写注释或者是如何写版权信息,而是提出若干比较有代表性和比较优美的编程习惯(这里称做风格)。一般来说,php和perl等web脚本程序,都 不可避免地和html等扯上关系。而相当多的程序员并没有很好地注意自己的php/perl代码和html代码的关系,造成了程序行艰涩难懂,结构混乱最 后连自己都懒得看的结局。本人从开发ZSU-Slash-Pro的这一个月里发现,优秀的程序不仅仅有优秀的算法,还有优美而易懂的程序结构。尤其对于大型程序来说,如果代码含糊,结构混乱的话,即使是程序开发者本人,看起代码也会觉得格外费力,其他人看起来就更加辛苦了。 因此很有必要摸索并制订出一套合适的编写代码的规范,用这套规范来约束和统一程序开发人员开发的代码风格。使之易于阅读和修改,方便日后维护和进一步开发的人员,使调试程序简单化成为可能。这里,我主要参考了PHPSlash和phplib和FreeTrade等几个中大型程序,结合自己的一点小经验,总结出了以下几点:(1).通用内容做成包含文件 这个方法是将每个生成的页面都会包含的通用内容做成包含文件,这样减少了程序的长度。便于统一修改例如phpslash中它每个页面都要使用一个统一的 Header/Footer,因此只需要创建两个包含文件slashhead.inc和slashfoot.inc文件,然后在每个php程序中使用 require语句包含它们进入代码内部就可以了。 注意:并不是只规定使用header和footer,如果你愿意,你可以添加任意多个require的部分。(2).公共函数库对于那些经常使用的函数和变量,没必要在每个程序内都定义和声明,而只需要将它们放到一个公共的函数/配置文件内就行了。 例如PHPSlash中有几十个函数,这些函数都统一地存放到functions.inc中,并被包含在了配置文件config.php3中。这样所有页面调用到里面的函数时候就不需要定义而只需要直接调用就可以了。 (3).html代码生成函数(库) 对于一些经常需要编写的html代码,可以用一个专门的函数生成这些html代码。 例如一个显示登陆的对话框,你就可以将这个对话框的内容编写一个函数叫dsp_login()。这样每次你需要显示的时候只需要直接调用这个函数就可以 了。同样道理,你可以将生成页面的头部和尾部都做成一个函数,例如叫put_header()和put_footer()等。这样就很轻松地将html代 码和php代码分离了。(4).封装过程 尽量隐藏具体操作的过程,取代的是面向对象的类或者某个操作函数。这样的好处就是将过程封装起来,使主程序简洁明快、层次清楚。例如某个注册程序,它需要完成显示注册窗口、检索用户、显示出错、插入用户、发送电子邮件等5个功能。如果把这5个功能都全部用一般的过程设计的话,代码相对难懂。如果换成5个操作函数(或者说把具体分析操作过程封装起来的话)那么就非常简洁而易懂。以下是程序主体:dsp_reg();check_user();if ($return=true) insert_user();mail_user(); else dsp_error(); 可见这样的程序即使是初学者都很容易看懂。 (5).功能分块化尽量将程序需要执行的功能分化成对应的操作/动作,也就是分块化,好处是易于程序调试,条理清楚。 一个最好的例子就是PHPSlash的admin.php3。它将所有的功能都归纳成了一个op值。 例如要删除一个用户-$op=userdelete。其实它这里还有一个小技巧:就是不是直接调用某个op而是在表单发送的时候发的是另外 一个值user_ops,这个值有几个可能:删除/添加/更新。那么它在程序内有一个判断阵列,判断出这个user_ops应该对应什么op,因此方便设 计程序。这里假设一个发布新闻的简单系统,所需要的功能就是发布新闻,删除新闻,更新新闻。 那么归纳成以下3个op:post/delete/update,以下是结构流程(用swich语句):swich($op) case post: postnews(); break;case delete: delete();break;case update: update();break;default: dsp_news(); 由以上几点可以看出,如果是能够按照上面提到的几点设计程序的话, 那么你设计的就会是个结构良好,代码优美易懂的好程序。不过,这还必须取决于良好的程序设计构思。以下给出一个注册程序的例子,它体现了本文和本编程规范 提到的大部分内容。整个程序从设计到完工的时间仅仅用了5个小时。虽然并不快,但是基本上是一写好就运转正常,没有什么逻辑错误,结构也比较清楚。 接下来读者将看到如何利用以上技巧和原则编写一个具体的程序。 九.使用phplib编程具体例子(二) 3.具体程序设计 (1).功能要求: 这里需要做的是一个注册程序,它的功能要求是:能够自动注册一个合法用户,并且将自动为用户生成一个8位的密码并发送到用户的邮箱。其中标识用户的是唯一的用户名字和唯一且真实的电子邮箱。申请的流程是:先输入用户想注册的用户名字和他的真实电子邮箱。 - 然后系统查询这个用户的名字和邮箱是否存在于数据库中- 如果其中一者存在,则显示错误并返回重新输入 - 如果两者都在系统数据库中没有记录,说明用户可以注册,显示欢迎画面- 显示确认画面并注册用户信息- 自动生成密码并发送到用户邮箱。 (2).程序流程: 基本上都和申请流程类似。根据每个功能的不同设计不同的函数进行操作: a.显示查询页面dsp_query();/空白模式 输入查询数据,下一步b.执行查询函数query(); 如果成功,则下一步如果不成功则显示错误并返回 c.显示确认页面 confirm_reg(); dsp_reg();/保存模式 发送表单d.插入用户 reg(); 加入判断:是否多次刷新页面,如果是就不显示“恭喜”字样。insert(); mail_user();success();(3).功能函数:这里动用到10个函数。各个函数的功能如下:dsp_query();/显示查询画面和确认画面并自动根据不同画面选择不同op查询: op=check 确认: op=insert query();/查询函数,查询输入的用户和邮箱是否存在 confirm_reg();/确认要注册的函数reg();插入用户的主函数,完成主要的动作make_passwd();/生成8位随机密码insert();/插入用户信息的函数 mail_user();发送注册信息和用户密码到用户信箱的函数 success();/注册成功函数,显示成功信息 error_msg();/拥有各种模式的错误提示函数current_time();/提示当前系统时间的函数 (4).页面结构: 采用了header和footer包含的技术。并且所有和数据库连接的类和配置都定义在config.php3中并且使用Zsulib。其中调用到Zsulib中的面向对象的数据库连接技术。 主体结构是: Header.incregister.php3 - require config.php3; Footer.inc 十.使用phplib编程具体例子(三) (5).开始具体编写 编写Header.inc,Footer.inc(略)编写具体函数和相关接口 (6).解决关键的技术问题a.如何编写query()呢? 这个函数需要的功能就是查询发送过来的用户名和邮箱是否已经给注册,如果其中之一或者全部都给注册了后就返回错误信息,否则进入confim_reg()函数。设计思路:先向数据库查询发送过来的$username和$email看是否返回空值。然后判断两个字段的查询值是否=。这就完成了基本的查询功能了。以下是query();的完整代码:function query($username,$email) $sl_q = new userDB;$sl_q-query(SELECT username,email FROM user WHERE username=$username or email=$email);$sl_q-next_record(); $tusername = $sl_q-Recordusername;$temail = $sl_q-Recordemail; if ($username=$tusername & $tusername!=) error_msg(user_exist); elseif ($email=$temail & $temail!=) error_msg(mail_exist);elseif ($tusername= & $tmail= & $username!= & $email!=)confirm_reg($username,$email); else error_msg(unknown); b.如何编写make_passwd()呢?此函数负责生成随机的8位密码。 设计思路:可以利用unix系统的random守护进程产生的随机因子,也可以利用php的随机函数rand同时为了获得指定的8为密码必须采用一个能够从字符串中切取到给定长度字符串的函数。这里我们采用substr。以下是make_passwd();基本代码 function make_passwd() $ran = rand();$passwd = substr($ran,0,8);return $passwd; c.如何编写confim_reg()?要达到能够提示你确认这个功能并不容易。因为必须两次调用dsp_query()而两次dsp_query()却需要完成不同的功能。因此必须让confim_reg()传送若干参数给dsp_query()让它知道应该如何操作。设计思路:让confim_reg()传一个$msg给dsp_query(),让它知道这是确认的信息以转换功能。以下是confim_reg()完整代码:function confirm_reg($un,$em) $time = current_time(); $msg =恭喜你!在$time这一刻你的用户名和邮箱还没有给注册!如果你确实想成为本站会员,请按注册按钮。;dsp_query($un,$em,我要注册,$msg); d.如何编写dsp_query()呢? 该函数功能稍微要复杂点,就是需要根据$msg来决定它自己要实现什么任务。设 计思路:由于查询和确认注册两者是不同的,因此查询按钮应该自动换成注册按钮。这个利用参数$botton实现。判断到底是处于查询还是确认,可以利 用$msg是否空来判断(因为确认函数会发一个$msg过来)。另外要区分两者的话,必须在发标单的时候自动选择$op=?因此也可以通过$msg是否空 来给$op赋值。查询是:check,确认是insert。以下是dsp_query()的基本代码:function dsp_query($un,$em,$botton,$msg) $head = ;if ($botton = ) $botton=查询;if ($msg !=) $action=insert;/如果有确认信息就insertelse $action=check;/否则就只是一般查询$cation = 欢迎到本站注册。一旦帐号生效你就可以享受到本站提供给会员第一流的服务;$post =用户名:信箱名: $foot = ;if ($msg =) fancybox(100%,查询,$head.$post. $cation .$foot,r); else fancybox(100%,确认,$head.$post.$msg.$foot,r); e.最后的判断语句: 判断程序的操作流程和函数调用。这里仅仅给出代码(非常简单的代码):switch ($op) case check: query($un,$em); break;case insert: reg($un,$em);case null: break;default:dsp_query();(7).结束编写 在PHP世界中选择最合适的模板-比较PHPLIB Template和FastTemplatePHP工程中的模板应用,是进行中型乃至大型项目中建议采用的处理表现层的好办法。但是具体到模板的实施,采用何种现有的模板技术却需要进行一番比较。PHP世界中比较受关注的模板处理有PHPLIB Template和FastTemplate两种,我们对技术的易用性和速度进行了评测-想知道结果吗?事情的起因:你用过FastTemplate吗?对 于PHP工程中的模板应用,其实我和我的同事们已经在许多的项目中接触过-关于它的好处,我想无论是在实际开发阶段还是上升到设计模式的角度都已经有很 多前辈先哲讨论过了。就项目实施而言,在一些中型甚至大型的项目中,有效的将HTML(还有其他文本形式的表现层)和PHP代码分开,不仅在开发阶段 可以分别提高界面设计人员和应用程序编写人员的工作效率,更会给项目的测试和维护带来巨大的便利。但是-本文的目的不是讨论模板的优缺点,也不是作为指导性的教程讲授如何在PHP项目中使用模板,而是以应用的视角比较两种PHP世界中最为流行的模板处理方式(其实只不过是两种模板类):PHPLIB Template和FastTemplate。其 实我一直都在安静的使用着PHPLIB Template-很稳定而且看上去速度也不错,以至于我并不想再去不安的寻找可能更好的替代品-虽然我也知道这个地球上还有 FastTemplate这样的东西(而且还在Perl的世界中大名鼎鼎)。直到有一天,有一个同事问我:不知道FastTemplate怎么样?为什 么我们不试试FastTemplate呢?好吧,就让我们试试!不过作为一个稳妥的方法,在任何新的模式或者方法引入项目之前,最好能够更加全面的了解它,以及找到一个或者几个足够说服自己和同事去采用它的理由-对于FastTemplate也不例外。主角出场:了解PHPLIB Template以及FastTemplate前 面已经说过,我已经使用PHPLIB有一段时间了-我想屏幕前的你也许和我一样,也对这个优秀的工具类库印象很深吧!同样,当我开始寻求模板的解决办法 时,很自然的就会在最接近身边的工具箱里搜寻,于是我找到了PHPLIB中的Template类。在最初的很快浏览完它提供的API之后(当然还得感谢 PHPLIB详尽的文档),我就开始了使用它的历程-直到现在。而FastTemplate似乎名气更响亮一些,在其发迹的Perl世界中自然是这样,在PHP世界中似乎也是,单单从这一点上就足够让人相信它的能力了。关 于两者的使用办法,本来我想在这里多废话几句的;但是毕竟觉得自己恐怕专门写出两篇教程来也没有现有的教程受欢迎-在本文的参考资料中有关于 PHPLIB Template和FastTemplate的有名教程,如果你自认还没有对这两种模板或者其中的一种有所认识,建议你先去看看那两篇文章,应该会得到不 少有益的模板应用知识。(一番鼠标点击以及眼球转动甚至亲自编写测试代码之后,)现在你对两种模板都有了一些了解,也许已经发现了它们之间的很多相似之处,在下面我就会将这些地方归纳一下。变量的设置很明显,FOO或者BAR的形式在两种模板中都是指定的形式;也就是说,两种模板处理方式中,模板文件本身的外貌应该可以是一致的(比如都是HTML文件中间含有将要被替换的以标识的变量)。 模板类的初始化(类的构建器)都需要在构建模板类的时候指定模板文件存在的目录位置。 变量的替换模 板处理中最常用的就是变量替换,两种方式除了方法名不同之外(PHPLIB Template采用set_var(),而FastTemplate采用assign()),用法几乎也是一致的-可以采用(key, value)的方式,也可以直接传递一个数组(array(key=value)。 模板文件的处理都是采用为每一个模板文件指定一个句柄(handler)的办法,同时句柄也可以作为变量的值替换另一模板文件中的变量。 解析、输出过程都是需要调用parse()方法(这个方法名竟然是相同的)将需要输出的模板文件解析后赋值给一个句柄,然后调用各自输出的方法(PHPLIB Template中是p(),FastTemplate中是FastPrint())输出该句柄的内容并结束处理。 重复解析的过程比 如从数据库中取出几条记录需要显示而模板文件只有可替换的一行变量的时候,就很需要这样的功能。两者都具有这样的功能,只是使用时稍稍有些不同而已 (PHPLIB Template采用parse(handler, value, true),而FastTemplate采用parse(handler, .value)在值的前面多加一个点),应该说PHPLIB Template的方法构造得相对优美一点。 区块解析的过程(或者可以称作动态解析)想像一下你需要从数据库中取出符合条件的数据并显 示在网页中-但是因为条件会不尽相同,你并不能明确的知道会有多少条数据-这时候如果你又要采用模板,那么区块就是最好的选择。它是在模板中用特定的 符号定义的部分,这一部分可以反复的被解析并添加到(而不是前一次的解析被后一次覆盖)输出网页中。区块也许就像下面显示的一样(左边是PHPLIB Template采用的区块设置,而右边则是FastTemplate采用的): 好吧,如果你对以上苍白的文字介绍还是有些摸不着头脑,那么我们就来看看两个详尽的模板处理的例程吧!(如果你有兴趣对后面的测试代码进行发掘,就会发现其实以下的两个例子都来自那里)怎么样,是不是感觉几乎是一致的?下面是区块解析的例子,你也会发现同样的效果:我们的测试目标和结果结 束了对PHPLIB Template和FastTemplate的了解,应该可以进入本文的正题了-在应用环境中当然应该选择易于使用同时速度理想的部件构建系统,那么对 于这样的两种类似技术,进行评测非常有必要。评测应该是由两部分组成:技术的使用难度和速度的快慢程度-前者是评论的部分,而后者是测试的部分。对于前 者,我们主要针对两个类提供的API进行评论;对于后者,我们会让测试的数据来说话,当然这中间免不了需要编写一些简单的测试代码。回合一:技术的易用性这 一回合主要是探讨PHPLIB Template和FastTemplate提供的API的使用情况。应该说,前者提供的API更符合PHP的一些常见编码惯例(特别是当你的项目中采用 了PHPLIB的其他类时,这样的规范
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 8.2 金属的化学性质 说课稿-2024-2025学年九年级化学人教版(2024)下册
- Unit 7第一课时Section A 1a~2e说课稿 -2024-2025学年人教版(2024)英语七年级上册
- 山东省胶南市大场镇中心中学七年级体育《跳跃:向上跳跃练习》说课稿(1) 新人教版
- 高中艺术素养考试题及答案
- 甘肃工会考试题及答案
- 2025居间服务合同范本
- 非洲中文高考试题及答案
- 电话面试沟通表达题及答案
- 2025贷款合同范本
- 番禺中考物理考试题及答案
- 粉尘涉爆安全培训考试题及答案
- 力量国际礼仪培训课件
- 危化品经营安全培训管理课件
- 交通安全应急处置预案公司
- 工商业分布式屋顶光伏项目投资分析
- 保安节前安全培训课件
- 临床运动处方实践专家共识(2025)解读 3
- 用户侧储能系统调度平台创新创业项目商业计划书
- 药厂生产管理培训课件
- 2021-2025年高考地理真题知识点分类汇编之地球的运动
- 2025海南国考时政试题及答案
评论
0/150
提交评论