2024年2月21日发(作者:)
第一章PHP爱好者必喜欢PEAR,我们的目的就是希望将PEAR介绍给PHP的程序开发人员,我个人认为引用程序库的程序开发方式已经渐渐成为趋势了,除了php、JSP外,像perl、C++也都有专属的程序库供其开发人员引用。借着引入PEAR,php的程序开发者除了可以大幅缩减撰写程序代码的工作与时间外,还可以用很简单的方式得到许多强大的动态网页功能,我将会列举许多的实例,让大家看了后,一定会啪掌叫好,并深深的迷上了PEAR。此外,程序代码很容易维护,安全性高也是PEAR另2个很吸引人的优点,PAER程序库宛如模组,可以轻易的抽换与更新,完全不会影响到其他的程序代码。我们是从最基本的观念介绍起,包括PEAR这个专有名词的含意?在那地方取得PEAR套件(package)?如何使用PEAR套件等?从第2章起,我们首先介绍PEAR的起源、历史与特色,让大家对PEAR有个基本的认识。第3章我们将会介绍PEAR程序库套件的安装与管理方法,这一章是非常重要的,在使用PEAR之前,必需先把这些基本功夫学好,虽然有点复杂,但是学会之后受用无穷,让您的PHP程序开发效率倍增,功能随着递升。第4章,是由简单的范例介绍如何引用PEAR程序库来开发PHP程序,让我们了解PEAR的一般使用方法,也为程序库的使用建立一个基本的操作流程。在第五章我们将介绍几个用法简单又功能强大的程序库套件的范例,让大家可以在动态网页上快速建立一些您以前无法想像而又非常酷的功能,让您的程序开发功力立刻提高。例如:◆让网页可以提供天气预报的功能,增加网页的附加价值。◆用很简单的方法在服务器上建立网页的快取(Cache),加快网页的开启速度。◆在动态网页上搜寻某台主机有提供那些PORT号的服务。◆在动态网页上查询某个网域名称(DNS),找出相对应的IP。◆动态產生HTML表格。◆快速建立「客户回函」系统,让网页浏览者可以从网页上寄信给网站管理员。◆让网页可以记录网页浏览者的行为,也就是做Log。第6章到第13章,我们会很详细地介绍一些很重要,很常用,但较为复杂的程序库套件的使用方法,这几章都是以套件为介绍的主轴,也就是说,一章只介绍一个套件,务求将这几个重要套件中较为重要功能,详细地介绍给大家。这些套件(packages)包括:资料库连线套件、表单制作套件、身份认证套件、档案上传套件、分页套件等等。最后,附录A会对PEAR的官方网站做详细的介绍,当您进入PEAR的世界后,您一定会经常来这个
网站寻找资料。知道如何利用官方网站,对于那些PEAR的PHP开发者而言,是十分重要的。附录B则会对PHP的物件导向程序设计做简单的介绍。喜欢和适合使用PEAR者分类如下:◆php爱好者,那一定要用PEAR,因为它绝对棒极了。◆PHP的专业程序设计员。您需要的是程序代码的安全性,可重复性,以及良好的工作效率,PEAR绝对是必备的。◆PHP的程序玩家,想要开发更有趣的,功能更强的应用程序,却不想被撰写PHP程序的一些烦恼绑缠,PEAR绝对可以满足您的要求。◆自己撰写PHP程序,却不喜欢每次都要从零开始,一字一字地敲打程序代码,PEAR可以提高您的工作效率。◆您想要学习功能性强,安全性高的PHP,当学会了PHP的基本语法后,可以试著使用PEAR。◆您需要量身定造的PHP应用程序,换言之,您不喜欢像XOOPS之类的套装应用程序,来试试PEAR吧。◆您需要容易维护的PHP应用程序,不想日后常修改程序代码,或因为PHP的改版而将整个程序重新设计。◆您希望您的PHP程序可以物件导向化,方便程序的抽换与模组化。◆您希望您的PHP功力更上一层楼,想要学习更多的PHP相关知识,透过PEAR的使用或观看PEAR的原始码,不失为一个好的学习途径。PEAR就是专门为有以上这些需求的人所写的。使用PEAR就像建一座房子一样。它是让您用预制件的方式,建一栋自己设计兼施工的大房子,但却不需要自己搅拌水泥,自己準备沙土、石头,自己烧磁砖.自己做铝门窗,自己做木工装饰等等...。PEAR就像是已经针对您的需求所订制好并準备好的预制件,您只需要运用创意将他们组合起来就可以了。我门在使用PEAR来编写PHP程序时,必需有一个先决条件,就是必需对PHP的相关知识有一定的认识。若您不知道甚么是PHP,什么是Apache、Mysql,或者您虽然知道,却还不会PHP的基本语法,那么,本文章目前并不适合您。建议您快去买些PHP、Apach、Mysql的入门书籍,详加研读后,才来看本文章。大家并不一定要是PHP高手,但一定需要具备看懂基本PHP程序码的能力。无论如何,首先对PHP的热爱才是阅读本书最基本的先决条件。第二章PHP有许多的规范与语法,我们不做介绍,请大家有空去阅读有关PHP的书籍,我们重点介绍的是PHP发展到4.0版以后。加入了物件导向(Object-OrientedProgrammingLanguage)的功能,虽然还无法像了Java一样做到完全的物件导向,但比起前版本PHP3.0已经是一大进步,也对PHP的程序开发者提供了更强大与更方便的开发能力。PHP5.0版以上的版本,已经转变成为彻底的物件导向化,提供了更多完全物件导向功能。我们所介绍的PEAR程序库对PHP4.3.0以上的版本是完全的支援。这一点请大家放心。为了大多数人著想,也考虑到PHP向下的相容性,本书的内容与范例都可以在PHP4.3.0版以上的环境中执行,因为PEAR完全支援PHP4.3.0以上的版本,小于PHP4.3.0版的环境,PEAR大部分也是支援的,只有小部分不支援。什么是PHP的物件导向?物件导向的语法在传统的PHP程序中较少看到,但若您了解JAVA这种程序语言的话,您应该可以知道什么足物件导向,我会在附录B有针对物件导向做简单的说明。另外,我要强调的是:PHP除了基本语法外,内建的函式就有超过上千个,横跨上百种类别,包括文字类函式、数字类函式、资料库类、图形类等等,功能相当强大,令人吒舌。但相对于程序开发者,如何善用这些函式,配合PHP的语法撰写有效又好管理的程序代码,将会是一大挑战。在今天,有PEAR这个由全世界众多顶尖的PHP高手所共同生產的智慧结晶,可以让我们轻松又有效率地
撰写程序代码,并克服许多撰写上的困难。以武侠界的例子来说,用PEAR撰写PHP就宛如数百位武林高手灌注他们的功力给程序开发者。让程序开发者不用从最基本的练功,扎马步练起,借用他们的功力就可以很轻松的让功力倍增,效率倍增。说了半天,到底什么是PEAR?下一个单元笔者就来做个介绍。PEAR这个字单纯就字面上而言意思是「梨子」。一颗梨子。官方网站的网址为http://R官方网站的logo中可以看到梨子:PEAR的开始是从1999年11月2l日。有一位名叫的先生,这位仁兄发起了一个专案,并号召许多的PHP高手来共同投入,他首先为这个专案建立了一些程序代码的基础规则,希望PHP的开发者加入这个专案时所撰写的PHP程序代码都需要遵守这些规则。这个专案名称就是PEAR,其实是PHPExtensionandApplicationRepository的缩写,意即「PHP的延续与应用程序库」,简单的说,PEAR其实是一个PHP的程序库。Bakken先生建立的程序代码基础如下,我只概略说明一下,并不详谈细节的部分:◆如果开发者要提供PHP程序库,程序的结构必须物件化。◆程序的缩排要遵循一定的格式◆程序中类别的命名也要遵循一定的格式◆程序代码的注解要有一定的格式◆档案命名要有一定的格式◆程序库撰写完成后要包装成套件,而套件的包装与安装方式,也有一定的格式。该专案欢迎所有的PHP开发者来共同开发PHP程序库,只要他们愿意遵守上述的程序代码基础规则。Bakken先生并组织了一组团队作为这个专案的控制主体,负责审核所有参与专案的开发者所提供的程序库,若通过审核,就将程序库分类并放入官方网站中供其他开发者下载使用,另外,这个团体也负责维护官方网站的维护与更新。有些人可能会很好奇,为什么有人会愿意免费撰写程序库让别人来使用呀?这就是开放原码世界的精神一互助、共享。试想,若每个开发者针对自己专精的部分开发程序库给其他人使用,同时也享用别的开发者所释出的程序库,是不是可以达到互助的目的,让每一个开发者共享所有的开发者的成果.不必所有的程序代码都要自己撰写。更棒的是,这些程序库是免费开放给全世界的人使用的,不只参与程序库开发的开发者可以享用(这种作法与Java或perl提供函式库的作法是一样的)。因此,全世界所有的PHP开发者可以省去许多撰写程序代码的时间,又因为使用程序库的开发者可以回报程序库的缺失给原开发者,原开发者也因此会不断的修正这些程序库,所以程序代码相对安全。另外,程序库开发者也会随着时代演进,加入新的功能到程序库中,让程序库的使用者可以与时俱进。详细情况可参阅PEAR的官方网站中所提到关于开发PEAR的目的说明:http:///manual/en/。我建议您有时间慢慢地看吧,继续将本文章看下去,您就会慢慢了解PEAR的神奇之处了。我在文章的最后有一章附录:PEAR官方网站的介绍,大家可以先参考一下。如果您还不太了解我介绍所谓「程序库」的意思,没关系,下一节就会透过实际的例子加以说明。2-3所有套件简介▓程序库VS套件介绍所有套件之前,我们必须釐清两个名词,以免读者混淆了,一个就是「程序库」,另外一个就是「套件」。假如我是是一个PHP的开发者,发展了一个可以处理所有资料库存取「程序库」,并想将这个程序库加入PEAR分享给全世界使用。当我撰写完理资料库的程序库后,我必须按照PEAR的规定,将程序库压缩成
一个「件」档,放在PEAR官方网站供所有人下载,也由于遵循PEAR的规定来压缩档案,这个套件就可以用PEAR的套件管理指令来安装或管理,这对PEAR使用者而言是相当便利的,关于套件管理指令,我会在下一章做完整的说明经过上述的说明,相信读者应该了解何谓「程序库」、何谓「套件」?其实,简单的说,把程序库包装好就变成了套件。▓套件与分类PEAR截至目前为止释出的套件已高达三百多个,共分为35大类,而且不断增加中。大家可以想像全世界的顶尖PHP开发者的结合,是一股多大的团结力量。下图是官方网站中套件的分类:PEAR因为释出的套件太多了,为了管理上的方便所以依套件的功能将套件做分类,同一类的套件在效果上都有相关性,但提供的功能却不尽相同小接下来,我将所有的分类用表格的方式做一个简单的介绍,让大家多了解一下PEAR套件可以提供哪些功能。
这么多的分类,每一类都会依功能的不同发展出不同的套件。以第一个认证类为例,若您到官方网站去看,会发现目前该类中共有8个套件,如下图:
这8个套件都是与身份认证有相关的套件,如果您想要网页具有身份认证功能,例如,可以让网页浏览者注册、输入帐号密码、判别身份、给予权限等等。就会需要用到这些套件。我再补充一点:有些套件已发展成熟,开发者会将它称为稳定(stable)版,但若程序库尚在发展中,但也已经可以使用,开发者将它释出,通常会称为测试版(alphaorbeta)版。官方网站也会记录套件的开发者与维护者的姓名,有时候一个套件是由许多人共同开发而成的。这些套件的讯息都可在PEAR的官方网站中找到,我在附录〈PEAR官方网站的介绍〉会介绍如何使用PEAR官方网站。2-4使用PEAR程序库的简单范例在这一节中,我用l个简单的范例来说明程序库的使用。假设您想要制作一个网页,并且希望知道网页执行时所耗用的时间,则可以借用PEAR所释出的名为Benchmark的程序库。这个程序库开发出来的目的就是用来计算网页的执行时间。首先,先将Benchmark程序库套件安装好(安装方法请参考下一章)。接著我们就可以开始撰写网页了,例如:我们建立了一个名为的网页。完整程序代码如下:
基于说明上的方便,我在每一行程序前面加上行号,大家实际上撰写程序时是不用加上行号的。第1行与第2行的程序代码首先引用Benchmark套件中的网页,这个网页内含计算纲页执行时间的程序库。include_once可以将某一个外部的网页放到这个纲页来,我称这个动作叫做「引用」,本例相当于执行了与两个网页。第3行,用new关键字建立一个Benchmark_Timer物件,并将该物件放入名为$timer的变数中。接著使用细$timer物件的start()方法启动时钟,然后加上我自己的程序代码,此例中是一行简单的程序。接著就是要结束时钟的计时,计算网页执行所花费的时间并将它显示出来。第8行先用$timer物件的stop()方法来停止时钟,并用第9行$timer物件的timeElapsed()方法计算时钟从启动到停止中间的时间差,并将计算结果放入$totaltime变数中。最后用echo函式显示时间差在网页上。执行结果如下图:由结果可清楚看到网页从开始执行到执行完毕总共花了0.66699秒,以后可以借由观察这个数字来判断系统效能,或做为程序代码改进的参考。如何,执行时间的计算是不是方便、快速又神奇呢!如果您需要在其他网页上也可以有计算网页的执行时间的功能,只要用上述方式套用在其他PHP网页上就可以了。事实上,其他套件的使用方式也跟这个套件的使用方式大同小异.差别只是在每个套件所提供的类别、方法以及使用的参数各有不同而已。套件虽然好用,但相信读者还是有许多的疑惑?例如:
ark程序库套件是怎么来的?要有哪些前置工作才可以使用它?2.我是如何知道使用Benchmark套件的方法?第1个问题牵涉到如何安装PEAR套件,以及安装后套件的管理、升级、删除等问题,我会在第3章加以介绍。第2个问题,笔者会在第4章针对如何使用套件、如何得到套件的资讯等做一个详细的说明。2-5为何要用PEAR为何要使用PEAR?我根据自己的心得,归纳出以下几点:1.省时省力:许多程序代码都被撰写在程序库中,开发者只需引用含程序库的PHP档,就可以拥有程序库所提供的功能,省去自行撰写的时间与精力。2.安全:由于这些程序库套件都将原始码公开,使用者若发现bug,可以立即向套件的开发者反映,开发者通常也会立即加以修正,让程序库的错误减到最小。3.容易维护:自行撰写的程序代码与PEAR程序库的程序代码分开,若PEAR套件因为有新功能被开发或修正错误而释出新版本,只需更新套件即可,完全不会动到自行撰写的程序代码。4.功能强大:PEAR套件所提供的功能非常之多,除了一般常用功能如:资料库的连结、设定档的处理、身份的认证、以及表单的处理。另外,较为进阶的功能,例如像网路邮局、网路管理、动态方式產生图形、RSS、Wiki,或者像phpBB的BBCode解析等等都可简单做到。5.让网页的程序开发与版面设计分开:PEAR提供许多样板的程序库,可让程序开发与版面设计分开,方便于程序开发者与网页设计者分工合作。6.对学习PHP者是一套绝佳的学习范例:程序库的注解说明十分详细,程序代码的撰写,具有一定的规则与格式,而且完全物质化,让开发者容易看懂并学习。有些套件还内附教学文件与范例挡,最重要的是:你不用花半毛钱就可得到,我们应该感谢套件的作者们,他们为我们付出了无私的贡献。2-6为什么要建立PEAR社团是什么原因促使全世界的PHP开发者大团结,共同开发出PEAR这个程序宝库呢?我就认为有以下几个原因:1.遭受其他竞争者的强大竞争:这一点第1章已经说明过了。2.PHP的物质化:从PHP4加入物质导向的功能后,PHP5更是进一步物质化。除了要与、JSP一拼外,就是方便于程序的模组化,让程序库的开发可以进行,有了物质化的功能,程序库才可以与开发者自行撰写的程序代码切割。3.开发者的共同需求:如果每一次开发PHP程序,都要从无到有完全自己来,虽然可以锻炼程序功力,但却没有效率,也不甚经济。若一些常用的功能可以用程序库的方式来处理,将可以解决许多开发者的困难。基于这种所有开发者都共同拥有的需求,让这些PHP的开发者分工合作,共同发展程序库,帮助自己也帮助别人。2-7PHP的竞争者与优缺点PHP是在1994年发展出来的,经过四次主要的改写,成为我们今天所看到的可以广泛应用且成熟的產品。到2005年四月为止,PHP已经运用于全球超过1900万个网站上,而且这个数字还在持续快速成长中。PHP与他们的竞争对手相比,他具有以下优势:高效能:不是我黄婆卖瓜,哈哈。..,我阅览过许多与Jsp的网页,效能上实在无法与PHP相比。(与Jsp的使用者应该不会看这篇文章吧)。●可以与许多不同的资料库系统相连结:其他的竞争者也可以,但没有PHP快。●易学易用:PHP的程序代码的写法非常直觉,容易学习。●支援物件导向:这方面Jsp是强项,但PHP5已经追上来了。●低成本:根本不用钱。●内建非常多的函式库:记得笔者以前使用Asp,内建的函式库实在少的可怜。●开放原始码:安全性会比没有开放的高。●PEAR程序库:这是最近的强力武器,用来与强敌们一争长短。●可携性:无论是各类Unix作业系统,如:Linux,FreeBSD,商业版Unix或Windows作业系统都可以使用PHP。
与Jsp当然也有他们独特的优点?例如,Jsp夹带JAVA强大的功能,它就可以呈现一些目前PHP无法做到的效果。所以Jsp也吸引了许多的使用者,但笔者对Jsp目前的效能实在还不甚满意,相反地,对PHP的快速度满意的不得了。使用哪一种程序,就由您自行做明确的抉择,不过,若您选择观看文章,相信我们应该都是同道中人,PHP的爱好者。总而言之,许多PHP高手共同构筑了一个强大的支援网,若您是PHP的程序开发者,却对这些高手的好意毫不领情,那不是太可惜了吗?(注译:package:套件或称为包;程式:程序)第三章▉3-1PEAR套件(Package)的资讯▓套件简介PEAR最重要的就是拥有许多的程式库可供开发者免费引用,这些程式库会被包裹成套件,而且每个套件中都会放入一个名为的档案.这是PEAR团队的规定,这个档案纪录著程式库的档案架构,版本编号等资料,有了这个档案,程式库压缩后才有资格称为「套件」,也因为有了这个xml档,PEAR所提供的「套件管理指令」就可以很简单地管理程式库,例如:可以用指令来安装套件、删除套件、观看套件资讯或套件升级等。另外.关于套件的安全性方面,使用者若发现套件有问题,可以借由论坛加以讨论或回报给开发团队,他们就会快速的进行修正与改版,也因此每个套件都会有版本编号加以区分改版的过程。详细内容请参阅〈附录官方网站介绍〉会有收获的。注意,若大家按照本文章的范例操作时,如发觉结果与我们介绍的内容有所不相同的地方,请不要觉得奇怪,那是因为PEAR套件更新的速度太快所致,我们所介绍的方法与原意是不会变的,只是过程会随套件的更改而变动。▓如何得知套件的相关资讯想下载套件或了解套件,读者可以进入PEAR官方网站(网址为http://),首页画面如下:圈选的超连结是放置套件的所在,点选以后就出现如下的画面:
1号圈圈所在较粗黑的字代表套件的类别,例如:第1类叫做认证类(Authentication)。这个类别目前包含8个套件,这些套件都是用来处理登入与登出或身份认证与权限设定等。2号圈圈所在较小的字代表套件的名称,如:Auth、AuthHTTP等等。大家可点选各套件名称进入观看更详细的套件资讯或下载套件。至目前为止,PEAR的套件共有35大类,三百多个套件,开发套件的成员共202人,但这些数字都在持续增加中,若大家将来有一天,也想为PEAR社群的一员贡献一己之力,也可申请成为套件的开发人员。要使用PEAR程式库,需要有以下几个基本步骤:1.架设好网页伺服器,例如Apache,并安装好PHP与MySOL。2.必须安装PEAR的一些基本套件,所谓的「基本套件」就是所有PEAR套件都需要的套件,例如,除错是每一个套件都需要的,所以基本套件中就包含了除错套件,只有先安装除错的套件,其它的套件才可以顺利进行除错。3.针对开发者的需求,安装特定的套件。例如,安装完基本套件后.若开发者想在网页中加入计算执行时间的功能,就必须用指令安装Benchmark套件,这个套件不是基本套件,必须由开发者自行安装。4.在PHP程式中引用套件的程式库档。以下我们来分别介绍,在Windows作业系统与类Unix作业系统下,如何安装与管理PEAR套件。3-2在Windows系列作业系统上PEAR的安装与管理▓安装Apache+PHP+MySQL如果您尚未建置好PHP的执行环境,建议您安装AppServ这套六合一软体,笔者就是使用AppServ来当作windows的伺服器环境。这个软体可以到http:///官方网站去下载。▓PEAR的安装方法安装好AppServ后,就可以开始在Windows上安装PEAR的基本套件,安装过程可以分为四个步骤。第1个步骤:进入http;///(或者http:///go-pear)网站请先连上http;///的网站,画面如下:
接着,将网页中的文字完全复制起来后,打开系统的附属应用程式中的记事本,将刚刚复制好的文字贴上,贴上后将档案储存于c:Appservwww,也就是网站根目录的位置,存挡时请注意,存档类型请选所有档案,副挡名需要为php,档名请自行命名,假设我自定存档名为,如下图:如果您不想怎么麻烦,也可以用Dreamweaver之类的网页编辑软件,打开一个空白的PHP档,然后将http://复制的文字贴上并存档。第2个步骤:安装基本套件打开浏览器,在网址栏输入“http://127.0.0.1复制go-pear网站档.php”或“http://localhost/复制go-pear
网站档.php”,其中所谓「复制go-pear网站档.php」就是刚刚复制储存复制文字的档案名称,在本范例中为,所以我输入“http://127.0.0.1/”,即可出现线上安装PEAR的网页,如下图:第一个画面是欢迎画面,我不多做介绍了。请按NEXT>>,进行下一步的安装步骤,出现如下的画面:这一页是用来设定PEAR套件的安装位置,最上端有一个HTTPproxy栏位,若安装者需透过proxy才能连上网路,请将proxy的IP与port号填写在此,若没有使用proxy,此栏位可保持空白。接著有l0项安装路径的设定,谙特别注意,其中有3个路径必须修改,分别为:1.第l项的Installprefix,请将预设的c:Appservwww改为c:Appservphp,因为我希望被安装的PEAR程式库,不要放入www中与根目录的网页混杂在一起。2.第9项的FilenameofWebFrontend,请将预设值改为c:。意思是在www中產生一个名为pear的资料夹,资料夹内的是系统產生的套件管理介面,这个介面后面会提到(为防后面的操作失败,请先在c:Appservwww中建立一个名为pear的资料夹)。3.第10项的h需改为c:,也就是需指定正确的档的所在位置。
其余的设定都用预设值就可以了,我在这里简单介绍一下其他设定项的意义:●第2项的BinariesDireetory,是将第一项的c:Appservphp指定为PEAR的根目录,并用变数$prefix来代表。●第3项的PHPcodeDirectory,就是PEAR套件被安装后档案所放置的位置。本范例PEAR套件被下载后的档案会被安装在c:AppservphpPEAR中。●第4项是如果被安装的套件有内附的说明文件,本范例会放在c:AppservphpPEARdocs中。●第5项足如果被安装的套件有内附的范例档,本范例会放在c:AppservphpPEARdata中。●第6项是如果被安装的套件有内附的测试档.本范例会放在c:AppservphpPEARtest中。●第7项是PEAR的cache档放置的位置,本范例会放在c:AppservphpPEARcache中。●第8项是快取(Cache)档的寿命,本范例快取档的寿命是300秒,也就是300秒后会重新快取。另外,需注意的一点是网页的阅览者须对这些路径具有写入的权限,否则无法安装。设定项修改完后,按最小方的install按钮,即可进行安装,画面如下:当最上方的安装进度达到100%时,恭喜您,您已完成了基本套件的安装。根据我使用ADSL下载速度2M的环境下测试,大约2分钟即安装完毕,若大家的网路连线速度不够快,或在安装到一半时连线中断,请按浏览器上方的重新整理钮或按F5即可重新安装。安装完毕之后.请大家别先高兴,PEAR共有三百多个套件,目前为止只是安装了PEAR的基本套件而已,并没有安装所有的套件,基本套件以外的其他套件则等到开发者需要使用时再逐一安装。大家可能会问:「那其他套件如何安装?会不会很麻烦?」大家请放心,这并不麻烦,下一个小单元中将会
针对套件的安装与管理做详细的介绍。安装完基本套件后,进入c:Appserv﹨php中将会发现有一个名为PEAR的资料夹,该资料夹即为套件经下载并解压缩后,程式库所放置的路径所在,如下图:对大家而言,其中的docs与tests这两个资料夹内会有学习PEAR的好东西喔。有些套件会内附使用教学文件,若使用者安装该套件后,教学文件就会放在docs资料夹中。而有些套件则是内附范例程式,使用者安装套件后,范例程式会出现在tests资料夹中。▓PEAR套件的管理安装完基本套件后,当开发者需要使用基本套件以外的其他套件时,会需要安装套件,若不需要某个套件时,就会想要移除套件,若套件版本过于老旧,则需要升级套件,也就是说开发者需要一套PEAR套件的管理系统。在Windows作业系统下的套件安装与管理可以有两种方式,一种是使用Web的管理介面,另一种足使用「套件指令」。笔者较为推荐后者,因为执行的速度较快,但若您对指令有畏惧感,也可以用第一种来轻松管理套件。▓PEAR套件的管理安装完基本套件后,当开发者需要使用基本套件以外的其他套件时,会需要安装套件,若不需要某个套件时,就会想要移除套件,若套件版本过于老旧,则需要升级套件,也就是说开发者需要一套PEAR套件的管理系统。在Windows作业系统下的套件安装与管理可以有两种方式,一种是使用Web的管理介面,另一种足使用「套件指令」。笔者较为推荐后者,因为执行的速度较快,但若您对指令有畏惧感,也可以用第一种来轻松管理套件。用web介面管理套件Web的套件管理在上一个单元安装基本套件时.就已经顺便安装好了。上一个单元中安装完PEAR基本套件的画面,在最下方会出现StartWebRrontendofthePEARinstoller>>这个连结,点选后即可进入套件管理的Web介面,如下图:
管理介面网页档的所在位置,就是上一个单元的第9个设定项FilenameofWebFrontend,我使用的范例是设为c:AppServ\www\,记得将它加入我的最爱。另外,先前的挡可以删除了。请注意上图画面的上方有3个连结,所代表的意义分别是显示已安装套件(listinstalledpackages)、显示所有套件(listallpackages)、显示尚未安装套件(listnotinstalledpackages)。一进入套件管理Web介面时出现的是显示已安装套件的画面,画面中有套件名称,套件功能的概略叙述与套件的版本编号,Local代表目前安装版本的编号,Latest代表PEAR官网上的最新版本的编号。若目前安装的不是最新版本时,会出现一个upgrade的图案,按下图案即可升级套件,版本编号旁的回收筒图案若按下,会将套件移除,请大家特别注意。接著我们进入显示尚未安装套件画面,如下图:
与显示已安装套件的画面大同小异,比较下同的是没有了垃圾桶图案,取旧代之是一个╂图案,意思是使用者只要按下图案即可安装该套件。安装失败?使用者安装时有时会出现该怎么办呢?通常会安装失败问题大多出在套件的「相依性」,何谓「相依性」?简单的说就是有些套件需要先安装其他套件才可使用,所以安装此套件前须先安装相依的套件,大家可点选画面中的回收筒图案,可观看套件的详细讯息,其中会提到与套件相依的其它套件。如下图:
例如:上图中,笔者安装Cache套件前,点选(!+)图案,观看套件的详细资讯时,在最下面的PackagesthatdependonCache中发现Net_Dict、ImageGraph等5个套件与Cache套件相依,所以须先安装cache套件才可安装这5个套件。否则,直接安装这些套件会出现”安装失败”的讯息视窗。套件的管理利用Web界面实在是简单又方便,但速度稍嫌缓慢,而且Web的使用者必须对放置套件的资料夹(本范例为c:Appserv\php\PEAR)具有写入的权限。笔者推荐用另一种管理方法,推荐的理由是因为它下载套件更快速,管理功能更强大,但缺点是需要打指令。用指令管理PEAR套件首先,与上一个方法一样需先用网页来安装完基本套件,虽然安装后已有Web的套件管理介面可用,可是请使用者备而不用,接著到桌面的我的电脑图案,按下右键,出现选单,请选择「内容」,会跳出系统内容视窗,在第4个名为进阶的标签中点选环境变数按钮,如下图:
出现环境变数视窗,请点选下方系统变数窗格中的Path,按编辑钮,会出现编辑系统变数视窗,请在变数值栏位最后加上“;c:Appserv\php”,请注意,“C:”前须有一个分号(“;”)喔,编辑完按确定钮关闭视窗,如下图:只要完成这个步骤,就可以使用指令来管理PEAR套件了。我们来做个测试好了,请选择「开始/所有程式(程式集)/附属应用程式/命令提示字元」。在>后输入:这个指令后按下键盘上的Enter键,将会出现所有PEAR管理指令与说明,如下画面:
注意:PEAR指令在Windows系统中使用大写和小写皆可我接著根据上图的说明,试验一下其他指令。例如若要显示所有已安装套件,只要输入“pearlist”即可,画面将会出现目前已安装套件的名称、套件编号、套件状态,如下图:指令失效?别急,若发现指令失效,只要到C:WINDOWS下找到档并用任何一中文字编辑器将它打开,将原本的“register_argc_argv=OFF”改为“register_argc_argv=ON”,存档后,将命令提示字元视窗关闭后重开,即可以无障碍地使用PEAR指令了。
就可以进行安装,请注意,套件名称使用大小写都可以,若套件状态为stable版则不用输入套件编号,例如:笔者要安装benchmark套件,只要输入当最后一行出现“installok:Benchmark1.2.1”即代表安装成功。但若安装时出现相依性的问题而安装失败时,该怎么办呢?例如笔者安装Html_QuickForm套件时.出现需要先安装Html_Common套件的讯息,所以我只好再输入“pearinstallhtml_common”.这个指令,终于出现“installok”的字样了。接著再安装Html_QuickForm套件,如下图,即可大功告成。若您安装的是Beta或Alpha版也就是试用版的套件,请在pearinstall后输入完整的套件版本号码。例如,若您要安装liveuser这个套件,但这个套件目前并没有释出stable版,那么您需要使用以下指令:也就是套件名称后面必须加上套件的版本编号,大家又会问,我怎么会知道套件的版本编号呢?这就请查询PEAR官方网站了。若安装的套件不是Stable版却没有填写套件编号,安装时会出现”安装非Stable版”的错误讯息,并停止安装。介绍您一个偷懒的好方法:若您一定要安装某个套件,不管它足stable版还是beta版,这时候可以使用一个指令:例如,同样想安装liveuser套件,却懒得去查版本编号,那就使用这样的指令吧:
指令中的“-f”代表强迫的意思「force」,就是不管如何都要安装就对了。用指令移除PEAR套件移除套件比安装简单多了,只要输入:这样的指令即可,如下图:假设我将移除名为benchmark套件,如下图:最后出现“uninstallok”代表移除套件成功了,移除套件的失败机率很低,请大家放心。用指令升级PEAR套件套件会有新的版本不停的释出,若要将旧套件升级成新套件也非常简单,只需要输入指令:即可,例如:笔者若要升级名为cache的套件,只要输入:就可以了。升级的过程与安装套件一样,有时会出现相依性的问题而升级失败,此时只要先安装相依套件就可以了其它指令较少用到,我在这里不再介绍了,请大家自行观看。只要在命令提示字元视窗中输入pear指令后,就会出现指令的说明。修改档这是PEAR使用前最后的工作了,不管您用Web介面,还足用指令来管理套件,都需要修改档。这个档放在C:WINDOWS目录下,请用文字编辑器将它打开加入一行字如下:加入后,记得存档,并将Apache重新执行,这样就可以了。大家应该看的出来,include_path的值就是下载并安装PEAR套件的所在路径,但是,为何要加入此行呢?笔者下一章会加以说明。我们来检视一下加入这一行是否让设定值改变了。请您在c:Appserv\www中建立一个档案,名为,档案内只写入一行:
接着在浏览器输入http;//127.0.0.1/或http;//localhost/,将可看见如下图:另外,我还建议,将档中的allowcall_time_passreference设定项的值改为On,原因我会在第6章做解释。若一切动作没有错误,出现的画面如上图,那么,就准备享受PEAR所带来的倍增PHP功力的绝佳体验吧。3-3Linux或FreeBSD作业系统上▓Linux或FreeBSD安装ApaChe+PHP+MySQL在这两种作业系统中安装PEAR套件,我觉得比WINDOWS系统还要简单。反而是安装Apache+PHP+MySQL与phpMyAdmin等软体,还有伺服器的管理比较困难。但您若是这两种系统的爱用者,这些应该都难不倒您了,如何让这两种系统成为网页伺服器并支援PHP与MySQL资料库,请参阅市面上许多这方面的专书,他们都写得相当详细,我就不花时间与篇幅来做介绍了。▓在linux上安装PEAR的基本套件在linux上安装PEAR套件前需要先安装lynx这个程式,使用rpm来安装的话.请用以下指令:Lynx-x.x-rpm可以在Linux光碟中找到。接下来,安装PEAR的基本套件请依循以下步骤。首先请打开Linux的终端机,输入以下指令:这个指令的效果与前一个单元在Windows系统中利用浏览器来安装基本套件是一样的。输入指令后会出现以下安装基本套件的欢迎画面,若要安装请直接按下Enter键,若要放弃安装,请按Ctrl+C。
接下来,会询问是否透过proxy上网,若没有请按Enter键跳过,若有请输入如下格式的URL:请用安装环境的设定来更改上述URL的帐号、密码、网址、port号。设定好后,会出现6个设定项,告诉安装者PEAR套件所安装的路径,其中最重要的是第3项PEAR套件的安装路径,预设是在:这个路径很重要,因为将来我们安装后要修改档时会用到。您可以自订安装路径,但笔者建议按下Enter,使用预设值就可以了。画面会提示安装者,有些基本套件会与PHP捆在一起,包括:DB、Net_Socket、Net_SMTP、Mail、
XML_Parser、PHPUnit等。请问安装者是确定安装?请按Enter键安装。接著画面就会出现下载套件与安装套件的过程,如下图,当最后出现:这段文字,就代表基本套件安装成功了,另外,PEAR的套件管理指令也安装好了,就放在/usr/bin/pear中。
若安装过程中,因为网路的速度不够快导致安装失败,请再重复上述的安装步骤。最后,不要忘了,到/ect/中将inculde_path设定为“.:/usr/share/pear”,请注意,路径前面需有一个点号与冒号。另外,我还建议,顺便将档中的allow_call_time_pass_reference设定项的值改为On,这可以解决套件中变数传递的问题。修改完后,需要重新启动Apache,不然新的设定无法启用。修改了这个设定后,当在网页中引用套件时,就不会发生找不到档案的错误了使用PEAR指令来管理套件在linux系统中安装PEAR基本套件时,其实已经「顺便」将PEAR的指令档安装在系统中了,比起Windows还需要设定,这一点实在是方便许多。您可以在shell的提示符号后输入pear指令,按Enter后将会出现所有PEAR套件相关指令的名称与说明,如下图:
注意:使用PEAR指令请用小写英文。若无法出现上述画面,请依照先前的方法,重新安装一次PEAR基本套件吧!在Linux中,指令的使用方法与Windows的指令使用方法是相同,请参阅上面的<用指令安装PEAR套件)、(用指令移除PEAR套件)、(用指令升级PEAR套件)等3个单元,我在这里不再重复讲指令的用法。使用Web介面来管理套件若您不喜欢用指令来管理套件,除了指令外,PEAR也提供了使用浏览器来管理套件的工具。安装方法有以下4个步骤:1.先用指令安装4个PEAR套件,依序是先装Net_UserAgent_Detect、再装Pager、HTML_Template_IT、PEAR_Frontend_Web套件,因为相依性的关系,安装顺序请勿随意更改,指令如下,指令前的#代表Shell的提示符号:2.请到旧系统内的/usr/local/lib/php/PEAR路径下,或新系统内的/ust/local/share/php/PEAR路径下,寻找档,将它拷贝到系统的网页根目录中,如下例:3.另外,为了给予这个网页在执行时可以有写入的权限,还要修改档和套件与指令所在的两个目录的拥有者与群组,将他们都改为网页服务器程式的执行者与群组。在linux系统里,网页服务器的执行者可能名为nobody,需要用以下的指令修改拥有者与群组。4.最后,打开浏览器,在网址列输入即可看见以下画面:
该画面中,左侧为导览列,提供了●套件管理(PackageManagement)●套件搜寻(PackageSearch)●PEAR属性设定(Configuration)●登入PEAR官方网站Login)●登出PEAR官方网站(Logout)等功能,其中最重要的是套件管理功能,该功能又可分为显示已安装套件、显示未安装套件、显示可升级的套件、以及显示所有套件,上图即为显示所有套件的画面。不管哪一种画面,都会显示套件类别与套件名称,还有套件功能的简单描述,而Local代表「本机安装的套件编号」,Latest代表「目前最新的套件编号」,若Local小于Latest,可以直接由管理页面升级套件。套件后面若有一个╋表示这个套件尚未安装,若想安装只要点一下╋就可以了。若出现相依性问题导致安装失败,会跳出警告视窗说明失败原因与相依套件的名称,使用者若遇此情况请先安装完相依套件后,再安装使用者需要的套件就可以了。什么称为「相依性」?简单的说,就是有些套件需要先安装其他套件才可使用,安装失败的警告视窗会显示需安装哪些相依套件,真是蛮人性化的。若想栘除某一套件,只需点一下套件后的回收筒图型就可以了。若想知道某一套件的相关资讯,只需点选圆形的¡。图案,就会跳出该套件的讯息视窗,内容有相依套件的介绍、套件的作者名称、套件的编号等。使用Web管理介面真的是十分方便,最大的好处是可帮助一些有「指令恐惧症」的电脑使用者。但我还是建议使用速度较快,安全性较高的」「套件指令管理」。3-4完全手动安装套件除了基本套件以外,其他的套件都需要使用PEAR的指令或Web介面来安装、移除、升级。但是,若您对PEAR团队帮所有PEAR的使用者準备的管理指令与Web管理不喜欢,也不想用,那就只剩下一个选择了,就是使用完全手动的套件安装方法。
请先到PEAR官方网站,选择好要使用的套件,假设我们想要使用Benchmark套件,这个套件并不是基本套件,所以必须自己下载来安装。Benchmark套件在PEAR官方网站的画面如下图:点选画面中的版本编号1.2.6就可以下载最新的Benchmark套件。下载后,将套件解压缩,就可以看到程式库的档案了,我们进入解压后的Benchmark-1.2.6资料夹,会出现如下画面:其中的先前我已经有介绍过了,重要的是Benchmark-1.2.6这个资料夹,里面是放著Benchmark程式库的PHP档,进入Benchmark-1.2.6资料夹后出现如下画面:
我曾经在上一章的范例中引用档,这个档包含了Benchmark_timer类别。其他的PHP档是档需要的其他档案。Docs资料夹主要放著这个套件的一些范例或使用指南。将档旁的资料夹Benchmark-1.2.6改名为Benchmark并放入系统中,假设我将Benchmark资料夹放在/usr/local中。最后,不要忘了修改的include_path设定,在最后面要加上“:/usr/local”,还有以后所有的套件都要放在这个路径下。OK!大功告成了。我们若果要在网页中引用Benchmark的程式库,只要在纲页上方加上:将来若要删除这个程式库,也只要到/usr/local中将Benchmark资料夹删除就可以了。以上就是全手动的套件安装法,优点是安装者会十分清楚套件的架构以及放置的位置,还有就是这种手动的安装法适用于各种作业系统,缺点当然是必需花费许多的时间来做套件的管理。我认为学习手动的安装法只是为了了解套件是如何被引用的,以及如何寻找套件内原始档的位置。套件的管理还足使用PEAR的套件管理指令是比较好的方式.可让开发者不必为套件的管理问题来伤脑筋。第四章如何使用套件从第一章与第二章,大致上大家应该了解PEAR的意义,从第三章,也知道了PEAR基本套件与指令的安装方法。我们好不容易,搞定了使用PEAR套件的前置工作,接下来就可以一步步来感受PEAR的强大威力,相信大家已经迫不及待了。使用PEAR,大致上只需三个步骤,第一步是安装套件,第二步是引用套件,第三步是使用套件。▓安装您需要的套件各位还记得第二章我曾经介绍一个Benchmark套件的范例档吗?那是一个计算网页执行时间的范例程式。笔者再呈现一次原始码如下,借由该原始码来说明如何使用PEAR套件,并为了方便我来解说,特别在程式码前加上行号:
短短11行的程式码,除了第6行与第10行我用echo()函式显示「HelloWorld」字串与「本页执行时间为秒」字串外,其余的程式码都是与Benchmark套件有相关性的。假设已经安装好了PEAR的基本套件,但却尚未安装Benchmark套件,若直接执行的话,会出现以下画面:执行结果告诉我们,执行的过程中,发生了错误,并有两个警告讯息:●第1个警告讯息是程式执行到档的第二行时发生错误,错误的原因是无法开启Benchmark/档。●第2个警告讯息是说在include_path的路径下找不到Benchmark/档。这两个错误讯息其实所指的是同一件事情,当程式码的第二行要引用Benchmark资料夹中的档时,系统会先在档的同一路径下找寻Benchmark资料夹,若找不到,再转到档中,include_path所指的路径中去寻找Benchamrk资料夹。错误讯息告诉了我们,在以上两个地方都找不到Benchmark资料夹与档,这是当然的,因為我们尚未安装Benchmark套件,系统找不到是必然的。所以我们用指令安装的方法来安装Benchmark套件,只要使用:
这个指令,就可以了,安装画面如下:最后一行出现installok代表安装成功了。大家来重新整理一次档的执行结果,出现如下画面。这一次没有出现错误讯息了,因为系统会在include_path所指定的路径中顺利地找到Benchamrk资料夹与档。这两者都是刚才安装Benchmark套件时被安装上去的。由执行结果可看出我们已经成功执行Benchmark套件中的时间计算功能了。这可是本书第一个使用PEAR套件完成的php档。请注意,若前一章所提的档中的include_path的值若没有设定正确的话,仍然会出现错误讯息喔,而且windows系统与Unix系统的路径写法是不同的,请不要混淆。若您真的不会修改include_path,也可以用手动的方式,将Benchamrk套件下载,解压缩后将Benchmark资料夹放置到与相同的路径处,这样也是可以达到引用套件的效果,不过这不是一个好方法,尽量使用「套件管理指令」与修改include_path的方法吧,才不枉PEAR团队想帮开发者节省时间的一番苦心。▓引用套件第一个步骤安装套件完成后,第二个步骤就是引用程式库,笔者所谓的引用,就是某一个php档?与其他的档案结合的意思,例如上述的例子,虽然只是单一个php档?,但程式码中因为有第2行的将使得档执行时会在第2行插入并执行档的内容。Php引用其他档案的方法是利用4个内建函式,分别是:●Include()●Require()●include_once()●require_once()这4个函式可以互相取代,也就是说的第2行也可以改写为:或或这4种写法,程式执行的结果是一样的,差别在于include_once()和require_once()函式若发现某一个档案
已经在其他引用档中被引用过了,将不会再次引用,也就是可以避免重复引用同一个档案,这样子可以节省系统资源以及防止错误发生。因此笔者撰写php时若有需要引用其他档案,都使用include_once()或require_once(),而不用include()或require()。这4种引用的方式,会先从档案本身所在位置去寻找被引用档,若以范例档来说,当系统执行第2行的程式码时会先在档所在位置寻找是否有一个资料夹名为Benchmark,且资料夹中是否有一个名为的档。若寻找不到,将转而寻找档中所记载的include_path所指定的路径。若在include_path的路径下也找不到,PHP就会将错误讯息显示在浏览器上。本例中,系统执行档的第2行时,是在include_path所指定的路径下找到Benchmark资料夹与其中的档。所以若没有正确地设定中的incluede_path的话,就必须用绝对路径来引用档案,也就是说在Windows系统中,第2行应改写为:在Liunx中第二行应改写为:在旧环境的FreeBSD中第二行应改为:在新环境的FreeBSD中第二行应改为:因为在前一章中,笔者的档有做正确的include_path设定,将路径指到PEAR套件安装后所在位置。也因此可以在引用档案时撰写较少的程式码,不用麻烦地使用绝对路径,而且,若有一天笔者要在这两种不同类型的系统中移转PHP档?时只要修改档就可以了,不用改写路径的程式码,这就是设定档include_path值的好处。▓剖析原始码第3个步骤是使用套件,但在介绍如何使用套件内的程式库前,笔者必须先介绍一些PHP物件导向程式设计的基本概念,甚至于,我们必须进入程式库的原始码来了解一下程式库的真面目。◆为何要阅读原始码可能您会说,会用套件就好了,何必去了解原始码?看原始码总是让人头昏眼花。笔者认为,这话虽不错,套件的程式库通常是既强大又完整,您也许不用看原始码,透过阅读使用说明或范例程式,也可以将套件功能使用的很好。但我认为,透过阅读原始码,除了可以学习php的程式撰写,提升使用者的php功力外,也可以了解套件的功能是如何作用与启动的,最重要的是若使用套件的过程中发生问题,可以借由检视原始码来排除错误,另外,也可以将套件输出到网页的讯息中文化。本章仅就使用套件所需要的概念作介绍,也就是说若您只想单纯的使用套件的程式库,并不想管程式码的运作方式,那么以下的内容应该就足够了。至于较完整的PHP物件导向程式设计,笔者留待下一章再来详谈。◆PEAR套件的程式码共同的特点先前提过,PEAR团队订定了一些程式码的基本规则来让套件开发者遵守,也因此,PEAR套件有许多的共同点:①所有套件都採用物件导向的方式撰写程式码:我认为只有学习了PHP物件导向的原理,才能享用物件导向所带来的强大功能与方便性,而本章将带到一些php物件导向程式设计的概念,若您对php的物件导向程式设计已经非常了解,或者你只想单纯当个套件使用者,不想观看原始码的话,以下内容可以跳过,直接去看第五章吧。②所有套件中php程式的撰写都有一定的格式:在PEAR官方网站中的使用手册有针对php的撰写格式订定一定的规范,若要参与套件开发的程式开发者,都必须遵守此规范。我举个例子:开发者撰写php程式若需要缩排,一律须缩排四个空白,诸如此类。其他还有许多规则,请有心者自行参阅PEAR官方网站。
这样做对使用者最大的好处是:让程式码整齐有条理,阅读起来较不费力。③所有套件中每一段程式码前都有详细的注解:更重要的是注解也有一定的格式,因为PEAR中有一个phpDocumentor套件,可将注解从程式中抽离出来加以解析,并自动编制成使用说明文件或使用说明网页,让开发者不用额外撰写使用指南。这个套件希望在我另外的文章中能够介绍。◆套件的程式码内容套件中的程式码大致上可分为四个部份;1.注解2.引入其他PEAR套件档3.类别4.属性与方法笔者将在以下子单元加以说明:▲注解下面我以档为例来说明,这个档存在于Benchmark套件中,我在自行撰写的范例挡中曾被加以引用。档前1-16行:除了第1行的“<?php”代表PHP程式的起始外,每一行前面都加上双斜线“//”符号,代表这16行都是注解。PEAR套件中的php档有个特色,一开始都会对套件作版权宣告,并注明开发者姓名、E-mailAddress、套件的官方网站网址、开发日期等资讯,这16行就是在说明这些,读者有兴趣者可自行阅读。
接著17-48行,开始用注解对中的内容做整体性的说明,这些注解都放在「/*」与「*/」中间,每一行前面另外加上「*」,这是phpDocumentor?这个用来解析注解与產生文件的套件所要求的规定。反正,还是注解就对了。有趣的是,注解中还有范例程式,作者真是有够贴心的。我为了说明上的方便把第一种注解称为「套件资讯注解」,第二种注解称为「使用说明注解」。以下都用这两个名词称呼之。▲引入所有PEAR套件的原始码都会先来一段「套件资讯注解」与「使用说明注解」后,接著的才是真正会被系统执行的程式码,但请注意,每一段程式码之前,程式的作者通常还会附上一段注解来说明该段程式码的功用,这些注解笔者称为「细部功能注解」。第50行是引入档,这个档是所有PEAR套件都要引用的档,因为一些广域变数(GlobalVariables)的设定都在这个档中,这些广域变数是所有套件都会用到的。安装基本套件时会安装一个「名为PEAR的套件」,这个档就是当时被安装上的。请读者注意,笔者通称「PEAR套件」时,是泛指所有PEAR的套件,目前共有272个,但这些套件中,有一个很特别的套件,这个套件的名称就叫做PEAR,这个套件是所有套件的根源,安装基本套件时,一定会安装这个套件。为了怕读者混淆,笔者称为这个套件为「一个名为PEAR的套件」用来与「PEAR套件」做区隔。
除了外,有些套件的php档会引入其他套件的php档,这就是所谓的「套件相依性」,若有这种现象,该套件安装前就需要先安装有引用到的档案的套件。例如Cache套件的原始档有引用到Auth_http套件的原始档,因此安装Cache套件前要先安装Auth_http套件。▲类别第52行开始进入程式的主要内容,首先用class这个关键?字宣告一个名为Benchmark_Timer的类别,后面接著的「extendsPEAR」代表这个Benchmark_Timer类?别是「继承自PEAR类别」。大多数PEAR套件内的PHP档,一个档只含一个类别,就是一个例子,这个档的内容就是一个名为Benchmark_Timer的类别,没有其他类别了,这样的作法有个好处,就是可以将程式码做适当的区隔,方便管理与阅读。Benchmark_Timer类?别的架构如下:大家可能会问,何谓「类别」?那来的「PEAR类别」?「继承」是一个物件导向程式设计方面的专有名词,第五章笔者再详细的介绍,但可以简单地用比喻的方式来说明:Benchmark_Timer类?别就像PEAR类别生出来的小孩,PEAR类别拥有的特性,它都有,且除了继承PEAR的特性外还有属于自己的特性。另外,PEAR类别在那儿呢?并没有在档案中看到「classPEAR」?PEAR类别是记载在档中,并不在里面,所以需要先引用档,这个继承才会有效,若没有引用档,浏览?器上会出现继承错误的讯息喔。那什么又是”类别”?笔者把「类别」比喻成「工厂」,工厂是用来生产物品的地方,我们居住的现实世界拥有各式各样的工厂,生产各种不同的物品,供人类使用。请注意,生活中各种不同的物品都具有各自的外型与功能,例如铅笔与纸张就是外型与功能不相同的两种物品,他们也由不同的工厂所制造。同样的,php的世界中程式开发者也可以建立各种生产不同产品的工厂,也就是不同的「类别」来生产各式各样的「物件」供开发者使用。每个类别都具有「属性」与「方法」,当透过「类别」生产「物件」时,每个「物件」都会拥有类别所指定的属性与方法。笔者举个例子,假设有一个名为「钉书机」的类别,这个类别中注明它拥有「大小」、「顏色」与「材质」三个属性,另外,还注明它拥有「钉」这个方法。若用工厂的概念来说的话,钉书机工厂所生产的钉书机都会有大小、顏色与材质三个属性,它有可能生产小型黑色的钉书机,也可能生产大型白色的钉书机,另外,他可以生产铁制的钉书机,也可以生产塑胶的钉书机,但是不管哪一种钉书机,都可以将纸张「钉」在一起,也就是具有「钉」的功能。开发者若要使用这个类别,可以自行决定「大小」、「顏色」与「材质」,例如「小」、「红色」与「铁」,在生产物件时,就可以产出无数个小型红色的金属订书机物件,且每个订书机物件都具有「钉」这个方法可以使用。在第一个范例档中的第3行:这一行的newBenchmark_Timer()就是一个「生产」Benchmark_Timer物件的方式,并将产生的物件放入$timer这个变数中,也就是由这个变数代表一个生产新的Benchmark_Timer物件,new关键字的意思就是宣告一个新的物件。使用者可以一次生产出许多Benchmark_Timer物件,例如:
上例中,$timer1与$timer2都是Benchmark_Timer物件,但却是互相独立的物件,彼此的运作并无相关性。就如同一家订书机工厂生产的两个外型与功能都相同的红色订书机,这两个订书机并无相关性,其中可能一个被某一个美女买去,另一个被某一个小学生买去,当美女使用订书机时并不会影响小学生使用订书机。▲类别的属性从第52-76行包含在classBenchmark_Timer后的大括号“{”与“}”中,用var关键字定义的变数,在类别中称之为属性,由程式码可知Benchmark_Timer类别拥有markers,auto,strlen_max三个属性,属性名称的等号后面不是变数的资料型态就是变数的预设值,在本例中,markers是一个阵列(array)型态的变数,而auto变数的预设值是false,strlen_max变数的预设值是“0”。所谓预设值,就是当开发者没有特别指定时,就把某个变数以预设值当作变数的值。当使用者用new方法产生Benchmark_Timer物件时,每个物件都会拥有这三个属性,我将new出来的Benchmark_Timer物件称为「时钟物件」,因为该物件是用来计算程式执行时所使用的时间。通常程式开发者帮属性命名时会以属性的意义当名称,方便使用者可以「望文生义」。例如:markers代表「标记」,意思是对时钟物件做个记号,请注意,可设定多个标记,用来检查每个标记间时间间隔的多寡。而auto代表是否一开始就自动啟动时钟物件。strlen_max代表字串长度的最大值,str就是字串(string),len代表长度(length),max代表最大值(maximum),稍后我会用范例加以說明这些属性的用法。▲方法中提供了许多的方法,我只用第161-212行的程式码来加以解說,大家可看到5个被包在classBenchmark_Timer中用function开头的段落。这5个function就代表类別的方法,也就是說,这里有5个方法,名称为display方法、start方法、stop方法、setMarker方法、timElapsed方法,而每个方法內大括号“{”与“}”中的內容就是方法实际运作的程式码。display方法是用来将时钟物件的执行结果显示出来,start方法是用来啟动时钟物件,由此类推,由字面的意思就可大致知道方法的意义。
在前例档中的第4行,$timer这Benchmark_Timer物件使用了start方法。在前例档中的第4行,$timer这个Benchmark_Timer物件使用了start方法。◆范例为了帮助大家了解,我再撰写一个名为的档案,内容一样是使用Benchmark套件,且为了解说方便,在每一行前面我编上了行号。完整程式码如下:
首先,第2行引入Benchmark资料夹中的档。为了让大家了解类别与物件的关系,特别在第3行、4行产生两个Benchmark_Timer物件,并分别放入$timer1,$timer2变数中。也就是说产生了两个时钟物件,请注意,这两个物件虽然长的一模一样,但使用上是互不相干的。在第5行中,第一个时钟物件启动,$timer1物件用start方法开始计时,请您想像有一个时钟按下开关开始计时。接着在第6行用php内建的sleep()函式让程式的执行停顿一秒。第7行接着启动第二个时钟,请您想像第二个时钟按下开关开始计时。并在第8行让程式在停顿一秒钟。第9行用setMarker方法,设定$timer1物件的marker属性,并将此时间鲇标记命名为mark1字串。其实在物件使用start方法与stop方法时,setMarker方法也会自动被执行,并将开始与结束的时间点标记名称设为「Start」与「Stop」。
第11行用timeElapsed方法计算$timer1时钟物件从启动到mark1标记,程式执行所使用的时间,相当于计算第1行到第9行的执行时间,并用”秒”为单位将时间差显示出来。这个方法有两个参数,第一个代表开始计算时间的标记名称,第二个代表结束计算时间的标记名称,所以分别填入「Start」与「mark1」字串。第13行再让程式休息一秒。第15行用stop方法将第一个时钟物件停止,也就是结束第一个时钟的计时,并将时间的使用情形用display方法完整显示出来。第18行用stop方法将第二个时钟物件停止,也就是结束第二个时钟的计时,并在第19行将时间的使用情形用display方法完整显示出来。OK!大功告成。执行结果如下图:让我们将执行结果对照一下程式码,在第5行时第一个时钟物件启动,到第9行该物件设定一个名叫mark1的标记,中间经过了第6行与第8行两个sleep(1),所以从5-9行总共使用约2秒的时间,显示在网页上的结果是1.999727秒,嗯,果然符合预期。接著对照第一个时钟物件在网页上display的结果。您会发现Benchmark_Timer物件的display方法会将时钟物件的执行过程用一个表格做完整的呈现。第一个表格最下面的总时间列total告诉我们,从开始到结束第一个时钟物件总共用掉2.999583秒,其中从启动到mark1用掉了1.999727秒,mark1到停止用掉了0.999856秒,检视原始码第9行设定mark1到第15行计时停止中间第13行也有一个sleep(1),所以计时的结果是正确的。第二个时钟物件的执行结果较为单纯,只有启动与结束两种状况,由第二个表格可知总共用掉2.000141秒,对照原始码,从第7行的启动到第18行的停止中间,第8与第13行各出现一个sleep(1),也就是约耗掉2秒钟,可见第二个时钟物件的执行结果也是正确的。到目前为止,大家是否觉得PEAR套件超好用的呢,有了Benchmark套件,我们可以轻轻松松知道每个网页的执行时间。日后若发生了网页执行速度缓慢的情形,想知道问题出在何处,这可是一个很好用的工具喔!!从第六章起,我们将逐一介绍几个常用的套件,这些套件的功能都是程式开发者使用率极高的,如资料库使用,表单的制作与验证?,翻页功能,简单的身分认证…等。虽然本文章无法将我所知道的套件全部介
绍,但若能引起大家的回响,能够吸引更多人共同投入PEAR套件的研究。◆寻求协助。套件的使用,本人认为是先苦后甘,先要花时间了解套件的使用方法,这一段是「先苦」,但若学会了,以后自行撰写程式码可就轻松愉快了,这一段是「后甘」。若使用或学习PEAR套件上遭遇了困难,该怎么办呢?何处可寻求协助?本人根据自身的经验,找出以下的管道供读者参考:◆阅读本文章阅读本文章当然是最佳选择了,目前PEAR的相关资料百分之九十九都是英文或其他语言,繁体?中文或简体中文的资料真是少之又少。我们计划将PEAR的研究心得继续在本网站里发布,目前因为中文PEAR的资料缺乏,希望尽己之力,为PEAR的内容多写一些介绍,同时继续研究和学习那PEAR中的272个套件,希望大家共同参与,并能够分享研究的成果。◆PEAR官方网站在PEAR官方网站,您可以寻找套件,下载套件,阅读套件的简介,开发者姓名,说明文件等。这里也有一些专家针对某些套件撰写的文章,或者您也可以察看套件被下载的次数统计等。总而言之,问题发生了,一定要试试来这里找答案!!不过可惜的是,网站内容全是英文,阅读起来总是有些文化障碍。详细内容请参阅PEAR官方网站介绍。◆mailinglist大家可在PEAR官方网站中加入使用者的mailinglist,以我为例,每天E-mail信箱总会收到数十封标题有PEAR字样的信,这些信的内容是全世界PEAR使用者将本身使用上发生的问题提问出来,借由mail来询问所有mailinglist的成员,而热心的成员会对针这些问题加以解答并同样mail给所有成员。加入mailinglist的缺点是,信箱必须够大,因为信真的很多。◆套件内的说明与范例有些套件很贴心的内附使用说明文件,甚至范例程式供使用者阅读与测试。这可让使用者节省许多探索套件用法的时间。大家若要学习一个新套件,第一步总是会先到套件内寻找说明文件或范例。◆原始码学习PEAR最直接的方法就是阅读原始码与注解。不过这真的有点困难,因为每个php档通常有数百行、甚至数千行的程式码与注解。幸好,物件导向的撰写方式让程式码「段落分明」,较易阅读,而且所有PEAR套件的注解都可以用phpDocumentor套件提供的指令将注解独立出来成为一份文件或网页,借由详细的注解来避免掉阅读大量的原始码。◆Google最后,若以上方法都找不到答案,我建议您使用史上最强的搜寻引擎-Google来找一找吧!我也经常使用Google找到不少PEAR相关的文章或范例程式喔。PEAR-像Google一样的分页功能读者应该行使用过Google这个超好用的搜寻引擎吧。每次搜寻后出现的资料数量总是多的令人吃一惊,有时甚至高达数千笔,数万笔。像如此多笔的数据是无法用一个网页来呈现的,Google的作法是将众多的搜寻结果以每页十笔、并在下方用页码超连结的方式来加以呈现,以下这个画面相信您一定不陌生:这就是所谓的分页效果,当然资料数量庞大到无法用一个页面显示所有资料的时候,开发者往往会使用分页的功能来呈现数据。除了因为数据量大,无法用一页显示外,分页还可加快存取数据的速度,并让数据的排序显得井然有序。
在PEAR中,有一个专门针对「分页」功能来设计的套件,就是Pager套件。使用这个套件可让开发者用很简单的方式做到分页的效果,并且完全不必使用DB套件的1imitQuely()方法来限制存取数据的范围,也不用撰写PHP来做翻页的超级链接。另外,套件内还提供许多设定项目让开发者根据本身的需求来调整分页的外观,更妙的是,可以在一个网页中放入多个分页效果。安装一开始安装PEAR的基本套件时,若读者是使用windows系统,就已经将Pager这个套件给安装起来了,也就是说,Pager是一个PEAR的必备套件。若是使用Linux或FreeBSD系统,可能安装的基本套件中并不合Pager套件,这个时候请用“pearinstallpager”这个指令来安装。读者可以使用“pearlist”指令来看看目前系统中是否已按装Pager套件,如下图:以上图中笔者现有安装的套件为例,倒数第3个就是Pager套件,画面并显示版本编号为2.2.4,且stable版。若您曾经安装过的是旧版本,你可以升级现有最新的版本,请用“pagerUpgradepager”指令,将套件升级。本章提到许多功能需要在的版木环境下才可执行。为了方便对「分页效果」作说明,笔者先将Pager套件所产生分页画面显示给读者观看。目前Pager提供两种分页的方式,一种称为「Jumping」另一种称为「Sliding」,请大家注意!第一个字母都是大写。这两种方式的分页有一些些不同,底下笔者将对这两种方式的不同处做个比较,并针对各个分页的细部功能定义一些名词。 Jumping方式举例来说,要将某一个含有104笔数据录的数据表用每页5笔的方式显示在网页上,总共将会分成21页,每一页的页码会放在页面的最下方并设置超级链接连到各页面,每个页码间用一个「空白」来加以分隔。另外,Jumping方式可以让开发者不用将2I个页码全部显示出来,显示多少页可由开发者决定,例如,希望一次只显示10页,免得页码太多影响画面的美观。显示画面为下图:
请读者注意画面最下方,出现1个非超级链接与9个超链接的页码。一开始进入网页通常出现的是第1页的内容,所以第1页的页码并不需要有超链接。页码的后方有一个Next>>的超链接,可让使用者查阅第10页以后的资料。若使用者按下2这个页码的超链接,画面会变成:请先注意最上方的网址列,最后出现一个“?pageID=2”的字符串。它是代表当使用者在上一个画面中按下2时,会将一个名称为pagelD,变数值为2的变数,用get的方式传送到服务器端,用来作为让服务器判断要显示哪一个页码的资料。另外,最下方的2变成没有超链结了,且页码的最前方出现了<若浏览者想点阅第10页以后的页码,稍微麻烦的足,必须先按下10这个页码的超链接后,再按下Next>>超链结才可进入第11页起到第20页的10个页码连结。以下两个图显示了若要观看第10页以后的数据,需要有两个步骤:1.先点选页码10来到第10页。
2.接着再点选Next>>,就可以进入第11页到第20页。这就是Jumping方式的分页,也是Pager套件的预设分页方式,笔者觉得这个分页方式功能已经十分完整了,不过下一个介绍的Sliding方式在跳页的功能上比Jumping更优胜。这个方式与Jumping方式最主要的不同点在于:被点选的页码,会出现在所有页码的正中间,也就是说Jumping方式下方的页码不会跳动,只有当按下最后一个页码后再按下Next>>超链结,页码才会变动,但Sliding方式会让被点选的页码跳至所有页码的中央位置。另外,这个方式预设会用“|”符号作为页码的分隔,最后面还会有一个最末页的页码超链结,可让使用者立刻就跳至最后一页。Sliding方式的分页如下图,当第1次进入网页时,会出现第1页。若点选的页码一直往后增加,被点选的页码会出现在正中间,而且,最前面会出现第1页的页码,让使用者可以立刻回到第1页,另外页码前后还有<<与>>两个超链接可让读者往前翻与往后翻页。例如下图中,
笔者点选第8页,8这个页码就会跑到所有页码的正中央,最前面会出现第1页的页码,最后面会出现最末页的页码:这里要提醒读者注意一下,PEAR中有一个名为HTMLPager的套件.这个套件与Pager套件是不一样的,请不要装错。另外,很久以前,当Pager还是版时,Pager套件与Pager_Sliding套件分别代表Jumping与Sliding两种分页方式,但是当Pager套件发展到2.x.x时,这两种分页方式已经整合在一个套件内了。所以,若安装了以上版本的套件,就可以不用在安装Pager_Sliding套件了。▓1-4简单范例为了用范例来介绍套件的用法,笔者建立了一个名为Schoolnews的数据库,内含一个名为news的数据表,并在其中放入了104笔数据。另外,笔者尝试用最简单的方法,尽量利用套件的预设设定来将数据表的104笔数据显示在网页上,并建立分页的效果,目的是让读者先了解最简单的Pager套件使用方式,范例档为,程序码如下:
首先,第2行与第3行分别引入DB的类别档与Pager的类别档,DB的类别档先查阅PHPPEAR的文章,这是用来做数据库连线与存取的套件。Pager的类别档是第1次引用,请大家注意引用方式。第4行先利用DB类别的connect方法建立与schoolnews数据库的连线物件,第5行建立一段SQL叙述,内容是抓取所有news数据表中的所有数据,并依照日期由近到远来排序。接着第6行再利用连线对象的getAll()方法,将抓取的资料以阵列的形式放入变数$rows中。最后第7行将数据库连线关闭。把数据表news中104笔数据全部抓出来并以阵列的形式放入$rows变数后,就可以开始进行分页的工作了。进行分页之前,需对分页功能的一些设定选项做设定。并把设定的结果放入一个阵列中。第8行到第12行,就是一个简单的「分页设定项」所组成的阵列,在个范例中的设定项阵列设定了四个项目。分别是:●mode:设定分页的形式,设定值只可以是“Jumping”或“Slidhg”字符串,此范例先用Jumping方式。●perPage:这个设定项目是设定每页出现的数据笔数,本范围设定每页显示5笔数据。●delta:页面检索会出现的页码数量,本范围设定一次出现10个页码。●itemData:要显示的数据所组成的阵列,此处指的就是$rows这个用连线物件的getAll()方法所取得的阵列。事实上,分页相关的设定项目总共有32项,除了itemData这个项目是要设定的项目外,其它都可以用预设值。
有了$params这个阵列,就可以开始建立一个「Pager物件」了。方法一样是用new,但是$params阵列必须当作建立物件的参数,如第13行。pager物件建立完成后,笔者将该物件放入$pager变数中,也就是说,$pager变数就是一个依照$params阵列所指定的设定值来产生的Pager物件。接着第14行用Pager物件提供的getPageData()方法,将网页浏览者点到选某页面时,属于该页面的数据全部抓出来,放入$datas变数中。例如网页第1次载入时的画面是第一页,getPageData()方法就会将第1页的5笔数据用阵列的形式放入$datas变数中,若是使用者点选第5页的页码,$datas变数的内容就是属于第5页的5笔数据所组成的阵列。剩下的工作,就是使用者所点选的那一页的数据显示出来,整个范例就可以大功告成了。可大功告成了第19行,利用foreach迥圈,将$datas阵列中的5笔数据一笔一笔地取出并放入$data变数中。第2l行与第22行中,配合一些HTML标签,将每笔数据中第2、第4、第16个栏位的数据显示出来。第27行,使用Pager物件的getLinks()方法来建立「页数检索」,这个方法会传回所有页码超连结的HTML标签,这些都是以阵列的形式放入$Links变数中,这个变数中有一个较为特殊的key叫做“all”,这个key的value的值其实是页码超连结的HTML标签合而成的。第28行用echo的方法将$links变数中,key为“all”的value显示出来。最后第32行用Pager物件的的numPages()方法与numltems()来取得总页数与总数据笔数,并用echo的方式显示给使用者知道。执行结果如下:可以清楚看到每页显示5笔数据,而且页码只出现1~10,完全符合笔者设定的$params阵列的值。$links[‘all’]变数的内容就是画面中倒数第2行“页数检索:”后面的那一大串页码的超连结。在最下方,可看到Pager物件的numPages()方法与numItems()方法分别取出的总页数为21与总数据笔数为104这两个字。若笔者将上一个范例中$params阵列的mode设定项目改为“Sliding”字串,也就是分页的方式改为使用Sliding方式,另外将delta设定项目改为正整数5,其余程序码不变,此时delta代表的不是总共出现的页码,而是被点选的页码前后出现几个页码,则执行结果如下图,范例档名为:页数检索的方式变成不一樣了,例如,当使用者点选页码8时,8会出现在页数检索的正中央,而且前后各有5个页码,符合delta的设定值,另外,前后各出现第1页与最未页的超连结,还有<<与>>这两个超连结让使用者翻页。
如果,使用者点选页码8后继续点选页码9,会变成页码9在所有页码的正中央,前后各5个页码,分页的方式就以这种方式一直滑下去(Sliding的意思就是「滑」),这种方式就称为Sliding。综合以上说明,无论是Jumping还是Sliding的分页方式,可以将建立分页的基本流程分为以下几个步骤:1.引用DB、Pager类別档。2.用DB连线物件的getAll()方法取得所有数据录。3.建立分页的设定项阵列。4.建立符合设定项阵列的分页物件。5.用分页物件的getPageData()方法取得某一页的数据录。6.用foreach回圈将数据录内容显示出来。7.显示所有页码的超连结。8.显示全部页数与全部数据录的笔数。只要遵循以上8个步骤就可以建立一个基本的分页机制,至于更进阶的分页设定或分页物件的其他方法,后面笔者再进一步的逐一說明。▓1-5设定项的设定上一个范例中,笔者在$parmas阵列中设定了最基本的四个设定值,事实上,Pager物件的两种分页方式总共有32个设定项目可以设定,这32个项目除了itemData外都有预设值,若开发者没有在$params阵列中特别设定某些项目的值,Pager物件将会使用预设值。为何要有这麼多的设定项?因为无论是Jumping或Sliding,虽然都十分好用,但是有些开发者可能对分页的效果想要做细部调整,例如华人世界的开发者,想将分页中文化等。这些需求都可籍由设定项目的设定来修改分页的外观,以符合开发者的需求。底下就经常会用到的设定项目分別加以說明: itemData、perPage、deIta、以及mode等四个设定项这四个设定项先前范例中已经有提到并說明之,所以笔者不再赘述。只将这些设定项的设定值的数据型态再加以补充。●itemData:设定值须为阵列,阵列內容就是所有要显示的数据录,这个项目是唯一沒有预设值的项目。●perPage:设定值须为大于0的正整数,代表每一页希望出现的数据笔数。●delta:设定值须为大于0的正整数,对Jumping模式而言,de!ta代表页数检索中出现页码的总数,对Sliding模式而言,delta代表被点选的页码前后出现的页码数目。●mode:设定值只可以是“Jumping”或“Sliding”两个字串,代表的意义是分页显示的模式。 currentPage设定项这个设定项若要可以使用,Pager套件的版本需大于2.2.6版。设定值的型态须为大于0的正整数。这个设定项可让网页第1次载入时,出现的页面不是第1页,至于是第几页,则由设定值来決定。例如,笔者希望网页一载入就出现第3页,沿用的范例档做說明,只要在$param阵列中多
加入一行:也就是说$params阵列变成:其余的程式码完全一樣,修改后的网页存成范例档,执行结果如下图:由上图可看出,第1次载入出现的不是第1页,而是第3页。 urlVar设定项这个设定项足用来更改分页的urlVar变数的名称。所谓urlVar变数,是一个用来放置网页浏览者所点选的页码,并供服务器判断该显示哪一页的一个变数,通常会附在url之后,urlVar预设的变数名称是pagelD。例如,笔者将范例档原封不动的拷贝成范例档,执行后当笔者点选页码3,网址列的url后面会出现“?PageID=3”,也就是说,点选超连结时,有一个名为$pageID的变数,其值等于3,会借由get的方式将变数与值送到服务器端,供服务器辨认浏览者点选的页码。执行结果如下图:若笔者修改档的原始码,在$params阵列加入一行设定,内容为:这个设定的意思就是将预设的urlVal变数的名称由pageID改为mypageid,存档后重新执行,会发现url后面的变数名称已改变,如下图:
上图中可清楚看到,网址列后面的变数不是pagelD了,变成是mypageid。对大家而言,可能会有一个疑问,改url的变数名称会用在什么情况下呢?其实,这个设定项会需要修改大都是因为用在一个网页内有两个以上分页的情况。若一个网页有两个以上的分页机制,而预设的urlVar名称都是pagelD.也就是没有修改这个设定项的话,会造成分页时的混淆,若浏览者点选某一个分页的页码,其他分页也会跟著变动,所以若有两个以上的分页机制,则每个分页都必须将urlVar改为不同的名称,才不会造成这种现象。 altPrev、altNext、以及altPage设定项这三个设定项都是用来修改超连结的ALT属性内容,而且设定值的型态都必须是字串。何谓「ATL属性」?当使用者将鼠标指向网页内某一个超连结的瞬间,鼠标旁会出现小小的方框,内有该超连结的简单说明,这就是ALT属性。假设笔者将范例档拷贝成,执行后在页数检索中会出现三种ALT属性:⒈当使用者鼠标移到<⒉当鼠标移到页码的超连结时,滑鼠旁会出现“pageX”,其中X代表页码,如下图:当鼠标到Next>>这个超连结时,鼠标旁会出现“nextpage”,如下图:若开发者希望修改这三个ALT属性,只需要在$params中加入三个设定:也就是的$params阵列改为:
发布评论