萌萌妈妈 发表于 2015-2-4 00:27:10

PHP网页设计用封装类来公道的设计PHP项目--谈PHP项...

终于学会把表单的数据插入数据库,然后显示出来了,应该说一个程序的雏形已经诞生了。封装|设计|项目   编码关于及格的PHP法式员来讲并非甚么难事(或许只是消费工夫长短的成绩),因而体系剖析和设计这一阶段就显得尤其主要。不外本文其实不盘算会商和需求剖析、获得贸易逻辑相干的话题,而是针对体系设计方面停止切磋。
面对困难
编码关于及格的PHP法式员来讲并非甚么难事(或许只是消费工夫长短的成绩),因而体系剖析和设计这一阶段就显得尤其主要。关于一个担负PHP项目标体系剖析员来讲,面对着两个困难:

PHP言语自己的限制。
这一点在庞杂体系的面向对象设计中特别明显。PHP的面向对象特征在现有版本中固然失掉了改良,然而还不甚健全,基本缺乏以担负面向对象设计的完成言语;即便目光久远一些,期近将释出的以Zend Engine 2.0撑持的全新PHP中,面向对象特征也不会像如今盛行的Java或C++那样(关于这方面的内容可以拜见我在developerWorks中国网站宣布的另外一篇文章)。然而假如采取完整面向进程(正确说是面向Web页面)的体例,可以想见全部体系的设计会十分庞杂,而由此带来的编码庞杂和保护坚苦加倍难以敷衍。
现有材料的严重缺少。
这是尽人皆知的景象即针对Web项目标体系设计材料缺乏;而在这些无限材料中,关于PHP的设计材料又十分匮乏。假如本公司或自己也没有相干的手艺堆集,体系剖析员只能在暗中中探索办法(更坏的两种情形,一是照搬其他项目好比Java或C++的设计,二是以为项目复杂而不担任任的敷衍了事)。



熟悉面临的体系
既然如斯,采取何种办法妥帖处置PHP体系的剖析和设计?最后的构思应当需求分清项目承当义务的类型:

触及大批客户自己或客户地点行业的贸易逻辑的项目,包含办公体系、定单体系和其他贸易体系。
复杂网站项目,包含一些需求承当高会见量或请求疾速呼应的项目好比品牌网站或举动网站和其他一些网站。
综合性网站项目。凡是包括多个绝对自力的子体系好比旧事子体系、服装论坛子体系、产物摆设子体系等等。



PHP的设计初志在于处理后两种项目标急切需求,言语自己关于这些项目停止了优秀的改革。而浩瀚的PHP开辟者对这些项目也具有或多或少的经历,相干书本中的典范也大都环绕于此。绝对说来第一种体系一切的材料不多,各类出书物对其内容也很少说起。因而在本文中将题所述对第一品种型的项目停止具体讲述(有关MVC形式和类封装),同时附带说起第二种项目(有关黑客代码)和第三种项目标设计办法。固然,并非被归类的这些项目就只能采取本文描写的体例,体系剖析员需求衡量各方面要素加以选择。

计划一:触及大批贸易逻辑项目
若何分别用户界面和后台操作?若何防止将贸易逻辑搅浑于普通的流程掌握中?作为一个严谨的商用项目,就需求思索良多相似的成绩。关于由PHP担任的这类项目,贯彻Model-View-Controller(MVC)形式的设计是一个十分好的办法。

实际描写
在这里我不想多加注释MVC形式自己--复杂的从字面上和使用上说,经由过程将体系的设计分为Model模子/逻辑、View视图/界面、Controller掌握/流程三个逻辑局部到达优秀的项目后果,以此便当各局部开辟者的任务并下降往后的保护本钱。(假如您熟习JSP开辟的Model 2形式,可以发明它也是MVC形式的很好表现。)就实际的项目开辟而言,现存的很大成绩包含网页设计人员和法式开辟人员的任务交织和抵触和贸易逻辑嵌入页面形成不成重用也很难保护等等。引入MVC形式一方面可觉得体系的整体设计指出明白的偏向,关于开辟团队的分工也是优秀的指点。

既然按照MVC形式请求对体系的整体布局在逻辑上分红三局部,那末团队的开辟者中也存在着针对各个局部的开辟者。

开辟者脚色 相干体系逻辑 职责
网页设计人员 View视图/界面 设计一切用户界面的网页模板。
掌握流程开辟人员 Controller掌握/流程 编写体系流程中的一切PHP页面。
贸易逻辑开辟人员 Model模子/逻辑 开辟体系设计中划定的各个类(个中的办法)。



由以上的表格可以看出,传统的网页设计和法式开辟的人员分工被打破而取而代之的是依据体系逻辑规定的职责。关于网页设计人员,职责并没有改动,正确说因为如许的划分防止了以往与法式设计人员的胶葛,他们完成的只是网页模板,因而只需存眷于地道的网页代码(次要是HTML,或许会有其他客户真个代码好比WML之类)而基本不需求被办事器真个<? … ?>搅扰。法式设计人员则被分为两局部:个中对照轻易掌控的是贸易逻辑开辟人员,他们的义务是依据体系剖析员给定的模块(正确说是类办法)完成之,在他们手中的PHP更像普通的法式设计言语(好比Java)而与Web没有甚么关系;一时较难承受的是掌握流程开辟人员,他们的义务是在完成体系设计时制订的体系流程的同时,依据客户真个输出挪用贸易逻辑(响应的类办法)和输入更新的界面(对设计网页模板停止处置),在他们手中PHP可以充实发扬Web编程言语的优势。

代码组织相干的话题
如许的不雅念有些笼统,没有实例的演示很难承受。在举例之前先引见一下我对这类工程的保举代码布局:

一级目次 二级目次 三级目次 备注
/project_name 项目源代码根目次
/Templates 网页模板目次(View)
/admin 办理掌握台目次/admin下的网页模板
/Include 贸易逻辑目次(Model)
/Temp 一时代码目次(可选),可供开辟者停止一些实验代码的测试
/images 图片目次,网页模板采取
/css 款式单目次,网页模板采取
/scripts 客户端代码目次,网页模板采取
/admin 办理掌握台目次(可选),包括一切后台办理的功效代码
/other_dir 对应与源代码根目次下的/other_dir,包括办理该类的功效代码
/other_dir 其他与响应功效相干的目次,好比与用户相干的/member目次或与从产物相干的/product目次等等
/config.inc.php 全局设置装备摆设变量,界说体系中的全局变量
/security.inc.php 平安战略掌握(可选)
/error.php 毛病掌握前往页面(可选),也能够采取静态页面如/error.html或其他页面称号



看完以后您是否是被唤起了一点利用Java停止Web开辟的记忆?好比WEB-INF目次下的classes目次和lib目次和web.xml都是开辟中的划定规矩--固然撑持PHP的Web办事器不成能像Java使用办事器那样主动加载这些目次下的文件,然而划定一个适合的代码组织形式仍是十分有益于开辟的便当和后续的保护的。(我入手下手思索PHP项目标代码布局就是由Tomcat的开辟手册中取得了启示。)

一个用户登录的例子
依据以上的代码目次,前文所说的MVC形式的完成可以失掉更复杂的注释。以最多见的用户登录功效为例,假想/project_name目次下有一个/member目次包括有关于用户的一切功效,个中包括了login.php页面承受用户登录利用的用户称号和暗码,index.php页面是登录完成以后的用户主页,而/project_name目次下的error.php是登录掉败后的毛病显示页面。

用户经由过程体系的其他局部恳求进入用户主页即/member/index.php页面,此时该页面判别用户情形:已登录用户则直接显示本页内容(可以采取反省session等办法);未登录用户则需求登录(重定向到/member/login.php);呈现了未知毛病(重定向到/error.php)。同时接纳响应的反响。
假设用户被引诱至登录页面即/member/login.php页面,该页面承受用户的登录信息(用户称号和暗码),并判别是不是准确登录:准确登录则再次重定向到用户主页/member/index.php;登录毛病则重定向到/error.php。
假设用户被引诱至毛病显示页面/error.php页面(不管是从以上哪一个页眼前来),城市显示毛病信息。



流程图示以下:





依据以上的文字描写和图示,再联合MVC形式的完成,可以十分轻松的写出这几个页面的框架代码:

先看复杂的页面/error.php:

然后是/member/login.php:

最初是/member/index.php:




(注重:以上代码只是片段,并且没有思索项目全局,只起演示感化)

关于Controller
起首可以明白的是,以上的三个页面代码就是前文所说的Controller掌握/流程代码。很分明,他们的不包括特定的操作,也没有一行网页代码,有的只是与后面流程图分歧的流程掌握代码(放眼望去,这些页面的配合特色是充斥了援用网页模板并输入、获得对象并履行其某个办法或重定向)。

再选择个中的一个页面/member/login.php具体的注释。全部页面经由过程判别是不是提交表单分为两个局部:显示登录表单供用户填写和处置登录信息。作为前者直接援用一个处于网页模板目次/Templates下对应当页面的member_login.dwt并在解析后输入;作为后者先获得一个Member对象(该对象出于贸易逻辑目次/Include下的Member.inc.php中),然后取得登录判别的了局落后行重定向。在这个掌握页面的代码中,member_login.dwt作为View视图/界面呈现,类Member作为Model模子/逻辑呈现,而页面代码自己就Controller掌握/流程。上面就是到场标示的/member/login.php框架代码:





(关于模板类和在MVC形式中的使用,可以参考本站另外一篇文章《在PHP当选择适合的模板》)

关于Model
既然谈到了Model,上面就是另外一个主要的话题:类封装在PHP项目中的使用。

请注重用词"类封装"--这和"面向对象"或其他甚么"采取对象设计"的办法有着实质的分歧。"类封装"只是讲述了将贸易逻辑采取类办法的体例封装成各个分歧的类,因此这里的"类"并非因而采取了面向对象设计呈现的"类"--正确的说,这里的"类"实际上是对一系列相干功效模块停止兼并的了局。

为何不直接采取面向对象的体例而是采取这类看起来不三不四的举措去设计体系呢?PHP不是具有面向对象特征吗?不错,PHP具有如许的特征,然而十分不完整(可以参考本站另外一篇文章《从Zend Engine 2.0的设计蓝图(草稿)看PHP的未来》)。举例来讲,PHP是没有接口这一概念和完成办法的,同时也就没有甚么多重承继、办法重载之类的典范面向对象特点。假如非要采取面向对象的设计办法,或许在概要设计阶段可以十分轻松,然而具体设计阶段就会对照苦闷,而假如还有幸保持到编码阶段几乎就是苦不胜言了。另外一方面,假如不在体系中引入类的概念,而是采取函数来完成模块功效,那末可以想象在一个采取如许"地道"的中大型体系中会有几何的函数,由此带来的费事十分分明。

仍是回到PHP言语自己。固然PHP供应不了甚么实践的面向对象撑持,然而仍是供应了对类和个中的属性和办法的界说。那末天然而然可以想到的是采取类的办法封装相干函数模块,既可以自创一些对象设计的长处,又可以免完整采取函数模块的一些弱点。

(一些采取函数模块的体系会采取如许一种体例:将相干的函数编写在不异的文件中,如许在援用时可以引入独自的文件。好比Member.func.php这个文件中包括了一切与用户相干的操作,在处置用户登录时可以先require这个文件,然后挪用诸如member_login()如许的函数。然而如许的体例仅仅处理了体系中浩瀚函数的代码组织成绩,没有处理名字抵触的成绩。上面的举例中就会看到。)

好比上文的用户登录实例中,假如采取函数模块的办法,代码或许是如许:





而采取类封装的办法,能够就是如许:





或许您会感觉代码并没有甚么区分(乃至看起来采取函数模块的代码因为不需求获得新的对象而显得更简约一些),而真实的分歧是产生在include的文件外面。采取函数模块的办法将相干的函数纠合在一个文件中加以组织(有些体系还不克不及做到这一点,那末就会形成异常凌乱的场合排场),而采取类封装的办法在每个文件中声明一个和文件名不异的类(好比在Member.inc.php声明一个Member的类,这一点和Java的划定类似);而在利用时,都需求先辈行include(假如采取函数模块又没有停止很好的组织,或许有些人就会很"简捷"的将一切函数include进每个页面--PHP可不是Java那样编译履行,光是解析这些函数就会消费一段工夫),然而关头就在于采取类封装的办法可以清晰的指明挪用的地位--某个类(Member)的某个办法(login):从防止名字抵触的角度来讲这一点长短常胜利的;而关于代码反省和保护而言,便利水平更是不问可知。假想一个页面需求完成若干功效,因此需求include数个文件:采取函数模块的办法不克不及够等闲的从函数挪用中找到函数自己地点的文件(假如函数称号或include文件称号没有甚么一致划定规矩,那末这个任务就十分艰难了),而采取类封装的举措可以依据类称号和类文件称号正确定位类办法代码的地位。(或许您会以为如许一个小小的优点不足齿数,然而履历一个保护工程以后或许就不会再有甚么贰言。)

以上是采取类封装办法的缘由,决意采取这类办法设计体系只是第一步;完成全部体系的设计还有良多可以自创的经历。

局部设计可以自创面向对象的思绪。固然PHP中没有接口和笼统类的界说,承继机制也十分不完整,但最少具有了根基的类界说和复杂的承继关系。相似"公司-雇员"、"卖家-商品-买家"这类不言而喻的关系可以很轻易在体系中经由过程类和类关系界说。既然PHP可以做到这一点,就依照实践的逻辑关系去界说便可。
常常会在体系中呈现的另外一个情形是关于个别和列表的关系--如许说或许难以了解,想象一个BBS体系中的帖子列表和每一个帖子之间,就是如许的关系。依据设计经历,如许的关系大批存在于PHP或其他Web体系中。关于这类关系,我团体建议可以采取以下Item和Item_List的类封装体例:
Item类界说:Item.inc.php的代码
Item_List类界说:Item_List.inc.php的代码
因为PHP关于类的成员变量和办法并没有语法上的会见限制(均为公然),因而会带来对象利用方面的某些凌乱。基于此,建议在开辟团队的代码标准中加以划定,从代码使用的级别上掌握这一情形:
起首,可以经由过程对成员变量和办法的正文来讲明其属性,由此利用该对象的其他开辟人员可以懂得本人的利用办法是不是冒犯了划定的会见限制。(假如采取phpdoc等主动文档生成的东西,开辟人员乃至可以在不翻阅类源码的情形下经由过程阅读类文档准确利用它。)
其次,关于成员变量会见限制的思索,可以将一些次要的、常常需求被会见或更改的变量(在正文中)声明为公然。如许的作法可以省却大批get()和set()办法的代码--固然在其他的面向对象言语中这一点被以为十分丑恶,然而记住PHP不是Java,只需如许的用法公道,就应当勇敢利用。
从下面的示例代码中您或许已注重到了正文的比重--固然人人都懂得正文的主要性,然而依然有需要提出。这个示例中采取了Javadoc的款式,使用现有东西也能够很轻易的直接生成文档(固然您和您的开辟团队也能够界说本人的适合正文款式和文档生成东西)。关于体系剖析员来讲,您在设计阶段完成以后交付给您的开辟同伴的代码局部极可能就是这些正文占绝大局部的框架代码;你们之间交换的东西除那些没完没了的图表以外就是这些法式员最熟习的代码和正文了。



在PHP体系中停止类的设计固然不像构建面向对象体系那样需求各类公道的形式参与(也没有如许的"成本"为之),但仍是需求一番考虑的。逻辑上的公道性和操作上的可行性都是查验的尺度。

(说到类设计,又想到了合适PHP开辟的IDE成绩。据我所知对照专业一些有Zend出品的Zend IDE;别的还有作为JBuilder的Open Tools呈现的借助JBuilder的PHP开辟东西;不外最经常使用的仍是PHPEd或UltraEdit之类的编纂器。假如现有的编纂器可以十分伶俐的撑持PHP的类设计和代码完成就十分幻想了。)

关于View
最初说到的是View方面,固然这局部内容与网页设计人员接洽对照严密,不外PHP项目(和其他Web项目)的体系剖析员也必需存眷这一话题。可以看出MVC形式的使用使得网页开辟人员和法式设计人员的各自任务功效不会像之前那样相互影响,天然可以进步各自的任务效力(互相关系或许会比之前加倍和谐一些)。然而关于体系剖析员来讲,将用户界面分别为各个自力的网页模板需求停止很多剖析任务。

起首是肯定全部体系的流程,这一点在体系设计的早期就应当做到。而关于View视图/界面和Controller掌握/流程来讲,一切需求的页面都是环绕此流程发生。不外凡是此时可以在流程图上看到的或许只是相干的参数在各个页面之间传递,却不克不及懂得各个页面展现的内容--这就是下一步剖析用户界面需求停止的任务。

在剖析用户界面的任务中,第一步可以肯定各个页面中心、关于完成流程必不成少的用户界面元素(表单和表单域、链接等);第二步是肯定页面中需求呈现的导航内容;最初还需求根据流程复核。仍是以上文的用户登录为例。关于/member/login.php这个关头的页面,第一步可以肯定的是在用户提交之前应当显示一个表单,表单包括两个文本框供用户输出用户称号和暗码;而提交以后依据流程在本页面中不需求有效户界面,取而代之的是使用Controller掌握/流程这一逻辑层停止重定向。而第二步需求制订该页面中(正确说是在显示登录表单时)需求供应的导航链接,在这里可以加上到体系的主页或其他非注册用户页的出发点的链接(便利用户一时决意作废登录)和一个刊出现有效户的链接(针对已登录用户)。以后停止复核,此时或许会发明这一设计仿佛没有思索到在登录前更好的区分是办理员登录仍是通俗用户登录,那末就能够在表单中增添一个埋没域暗示选择登录的用户是筹办以办理员仍是通俗用户的身份停止登录。

肯定完用户界面的元素,其实不意味着可以将这些剖析了局交付网页设计人员停止制造了;还有最关头的一步没有实行--为剖析完成的各个页面制订模板所需的变量称号。关于以上的用户登录实例,假如体系有辨认已经登录用户的功效(根据之前会见时在客户端设置的相干cookie值)而且把这个用户称号显示在登录表单的用户称号一栏,此时就需求在member_login.dwt设计中申明该表单域将被赋值为一个模板变量(好比{USERNAME})。这一步调完成以后就能够交付网页设计人员停止制造了。

需求指出的是,在编码阶段极可能部分的一些体系设计需求停止修正,这个中或许就包含对网页模板的修正,需求细心处置。

关于代码组织的增补申明
还有几个文件和目次没有在上文说起:

config.inc.php -- 假如您熟习phpMyAdmin或其他phpWizard.net释出的项目,就应当十分清晰这个文件的感化:界说本项目局限内的全局变量(在每一个页面中被include)。我团体以为这是一个十分优秀的设计,因而也倡始在项目中使用。别的,为了包管与项目中其他的变量抵触,建议在该文件中界说一个多重数组,而各类全局变量都以该数组的某一个值呈现。如许便利团队中的其他开辟者只需求防止一个变量名的利用,而不是防止一切config.inc.php中呈现的变量名。利用这个文件的另外一个优点是因为将关头的变量(好比与办事器情况相干的变量)集中界说,可以便利的装置和移植全部项目。
security.inc.php -- 望文生义这个文件掌握并实行全部体系的平安战略。关于平安成绩,可以想到的是两种掌握计划:在每一个掌握流程页面顶端针对本页面加以掌握和采取一个掌握文件全部掌握并被到场每一个掌握流程页面。我团体倡始采取后一种体例,缘由也很复杂:界说复杂并且保护便利。固然比拟每一个页面独自界说,或许会丧失一点点效力(一些不需求平安掌握的页面也需求include该文件并停止辨别),然而取得的是对体系平安的全体掌握和代码保护的便当(丧失一个if…else…的辨别换取如许的了局仍是很值得的)。
/Temp -- 很分明存在于这个目次下的都是一个一时文件,而且这个目次其实其实不会呈现在项目正式刊行的版本中。假如开辟时对一些函数的利用不甚了然或实验一段没有相干经历的代码,都可以在此目次下创立文件;由于该目次就位于项目代码当中,可以十分便当的获得项目运转的高低文情况,大大下降了实验代码的本钱。
/admin -- 凡是对体系的后台办理内容应当放置在一个自力的目次中,我团体对照喜好admin这个简写词(固然也有一些情形体系剖析员以为不该该设置一个轻易猜想的办理目次称号以增添一重对体系平安的回护)。
/css和/scripts -- 都是与网页设计也就是View视图/界面有关的文件寄存处,分离是款式单和客户端剧本。如许做的优点在任何一本讲述网站计划的书本中城市有所说起。



计划二:复杂网站项目
体系功能是这类项目寻求的重要方针,而与此同时体系的保护和扩大几近可以不必多加思索。(或许这句话听起来有些相对,然而依据客户的需乞降项目标性质判别,尽最大能够以最短工夫知足客户的需求并使得体系高效运转就是项目胜利的最好查验尺度。)因而,或许这类项目就是PHP黑客的地狱(已经我也是一个过度寻求PHP利用效力的人)。因为这类项目标特别性,这里会商的局限不单单局限与体系设计而是从组建项目小组入手下手直到交付项目标进程。

起首需求存眷的是介入项目标人选(固然或许这是项目司理的职责,然而最熟习PHP项目特色的体系剖析员应当介入)。在PHP开辟人员方面,最少应当选择对PHP各类函数较为熟习的开辟者(这类项目不合适作为实际项目以培训介入的开辟新人),假如公司中还有可以在源码级别了解PHP的人员就加倍幻想(不外凡是关于普通的PHP开辟公司是不成能的)。而在网页设计人员方面,最好可以选择一些略通客户端(好比JavaScript)和办事器端(最好是PHP)剧本的人员;由于这类项目标一大特色便是单个网页代码量较大且同化网页代码(凡是是HTML)、客户端剧本(好比JavaScript)和办事器端剧本(好比PHP),到场懂得各类剧本言语的网页设计人员的目标不是为了增添团队的PHP开辟力气,而是防止在修正网页时影响法式设计人员的任务。

其次就是面向进程,正确说是面向页面的体系设计。绝对第一类项目,客户的需求在该类项目中体现得十分明晰,并且普通临时停止Web开辟的公司关于这类网站项目也应当有必定的设计经历堆集。设计中需求环绕全部体系的流程,包含每一个页面的输出参数和输入内容(包含网页中呈现的除导航链接以外的功效性链接),以求完整知足客户的需求;另外一关头在于肯定体系平安战略,在这类项目中次要是用户品级切实其实定和页面的会见权限,并给出完成的体例。不外还需求指出的是,这类项目中由编码阶段前往设计阶段的情形其实不少见,关于部分设计(好比页面传入参数或输入链接)的更改应当加和时掌握。

最初是针对代码和数据库的优化。在这类项目中需求恰当勉励开辟人员的黑客立场。保举的举措是体系剖析员给出每一个页面的伪代码(框架代码),而部分的完成则由各个法式开辟人员和网页设计人员停止。

关于PHP代码方面,凡是可以从以下几方面思索:

算法的选择和功效完成的体例:模块级其余优化,可以由几名开辟人员配合会商处理;
函数的利用:代码级其余优化,需求开辟人员对各类函数有清晰的熟悉,最少养成多多参考函数手册的习气;
数据库的查询和更改即SQL语句的利用:假如公司中有相干数据库体系的办理人员,可以就一些优化成绩咨询他们的建议;
其他应当防止的成绩:好比拷贝代码、等不良代码情形。



而依据我的经历,凡是会在这类项目中撰写的黑客代码以下:

轮回语句的利用出格是在查找时的使用:此时注重while和for的区分(想必人人在大学教室中都做过这类的法式),这也是优秀的编程习气;
SQL语句的优化:起首是尽可能防止过剩的数据库交互,这是进步效力十分主要的一点;其次是不关键怕长达几行的语句而宁肯利用所谓复杂的语句;再次是仔细思索查询语句前往的字段,削减不用要的数据。
表单提交值的获得,好比复选框和文本域。精致的表单域称号设计可以削减必定的代码量,而处置提交值时也需求注重处置的体例。



黑客代码在这类项目中值得勉励,不外最好在每段代码旁附上尽量具体的正文。

因为该类项目标特别性,完成项目标关头不单单在于体系设计阶段,因而给进项目入手下手、体系设计、编码和测试、交付这一进程的复杂描写:

遴选适合人员构成项目小组,可以思索发卖人员和客户代表的到场。
体系剖析员可以复杂的从客户的需求和以往项目经历的联合中总结出体系所需的每一个网页并对其功效作出描写,同时肯定初步的平安战略。这一步调中可以到场发卖人员和客户代表的到场。(此时网页设计人员正在筹办供应给客户的一系列网站抽象页面。)
具体设计中需求为每一个页面肯定地位和称号,加倍关头的是肯定输出参数和输入内容和分歧级别用户关于网页切实其实切会见权限。同时停止数据库设计。该阶段完成后最少应当供应体系的流程图(包含会见权限标识)和数据库设计材料。
网页设计人员和法式开辟人员拿到相干材料各行其是任务。关于前者,依据客户承认的一套抽象设计每一个页面;关于后者,入手下手停止"高兴的"(由于此时请求的是高效简介的代码--黑客代码)编码任务。此阶段任务中碰到的坚苦均需求反应到体系剖析员处,能够前往以上的第3步乃至第2步停止设计修正。
法式编写和网页设计停止后需求有一段整合的工夫,也是法式开辟人员对代码停止自我测试的阶段。同时在这一阶段可以停止的是代码(包含网页代码和法式代码)和数据库的优化任务。此阶段停止后应当可以供应一个完全的体系。
真实的测试阶段凡是都对照仓皇,这方面的手艺和经历公司也应当有必定堆集(假如有前提但愿采取一些软件东西停止不乱性和抗压才能的测试)。最初是供应一个可Web会见的地址供客户测试。此阶段完成后可以供应正式交付客户的体系。



计划三:综合性网站项目
已有一些大型网站利用PHP作为次要的开辟言语。关于这类项目,纯真从PHP手艺方面值得提出的话题不多,简而言之仍是依据网站各局部的实践使用情形(会见强度、操作行动等)选择以上提出的两种项目设计办法或综合利用。除此以外,依据我团体的经历,项目团队的组织和调和任务和项目各期完成后的保护任务等等是较之纯真的手艺加倍关头的要素。

关于这类项目,可以提出的建议是,恰当采用一些开源软件关于疾速、优良的完成项目很有优点。项目标某些局部可以直接引入开源软件项目标设计乃至是代码,不外条件是体系设计人员对这些引入的项目需求十分懂得,同时需求做好这些孤立的开源项目和全部项目之间的接合(好比平安战略的思索和全局变量的援用等)。

举例来讲,依据客户请求某个综合网站需求以下的功效:

庞杂的旧事宣布;
需求不多办理功效的在线服装论坛;
复杂的产物摆设;
需求用户办理。



(很分明这是一个企业网站的雏形。)

个中的1、2项很分明可以借用一些成熟的开源软件项目,而3项因为客户需求复杂自立开辟对照合适本钱。由此看来4项则是全部体系中最主要的局部--需求做好与1、2项利用的开源软件项目标用户办理集成任务(3项因为自立开辟的缘由集成任务十分复杂)。(某些手艺堆集较好的公司乃至关于以上说起的集成局部都有复杂的处理计划,那末如许一个网站项目标完成所需本钱十分巨大。)

几个特别的功效点
别的还有一些凡是项目中城市呈现然而必需妥帖处置的功效点:

1. 数据列表分页。
关于这个功效,互联网上的中文和英文材料都有很多。详细的手艺和实行细节不需求多说,这里只需求指出的是:

A. 建议封装成某一个东西类的办法或其他可复用的模式--如许的优点不言自明,任何人都不但愿体系中只需存在数据列表分页的时分城市呈现一堆几近不异的代码。

B. 假如针对一些效力请求较高的项目(例如上文提到的"复杂网站项目"类型),应当直接利用PHP自带的针对特定命据库体系的操作函数和与该数据库体系相干的了局集截取手艺(SQL语句),好比MySQL中的'LIMIT start, offset'之类;其他一些需求体系设计工整公道的项目(例如上文提到的"设计大批贸易逻辑项目"),假如采取了通用的数据库接口,出于兼容多种数据库体系的思索,可以采取此接口完成了局集的挑选,以丧失的效力换取体系更好的可保护性和可扩大性。也就是说,关于采取特定命据库操作函数仍是第三方通用数据库接口来完成数据列表分页,需求思索体系的功能和扩大两方面要素。

2. 毛病掌握。
这一点在上文当中也有说起。除创立属于东西类的毛病类以外,最好可以创立专门的毛病显示页面。该页面既可所以静态的HTML页面(表达一些对用户的歉意和失足以后的处置指点)或静态的PHP页面(可以包括详细的失足缘由和地址和其他更具体的信息,条件是在体系平安战略答应供应这些信息)。而毛病类的义务就是承受正常的法式中抛出的毛病,停止需要处置以后将信息一同重定向在毛病显示页面上。



同时,创立失足页面临于开辟阶段也有必定优点,可以填补现有PHP短少相似try{…} catch{…} 块的背例掌握的弱点,将调试中的毛病或输入经由过程毛病类抛出并显示出来。

3.上载与下载。
关于PHP来讲,上载的完成其实不会像其他盛行的Web开辟言语那样需求第三方法式的撑持,内建的机制可以十分复杂的处置。不外这里说起的是一些庞杂的上载功效完成。考查以下一个处置附加文件的流程:




该功效使得用户在撰写新的动静时可以附加其他文件,并且在动静没有提交之前可以随便的对已附加的文件停止删除或持续增添。这类需求会表现在很多办公相干的体系中,作为有经历的体系剖析员应当在体系设计阶段制订完成针对该类功效的实行企图。好比在图中所示的流程中,实际上是经由过程一个或多个表单的相互提交完成(详细设计不再赘述,供应相干的PHP文件参考;别的的一个直不雅的例子就是多半收费邮件体系的添加附件功效,假如有乐趣可以考查一下)。

至于下载,将文件置于办事器Web可会见目次下、供应会见者真实文件途径是最复杂的处理举措;不外一些体系中对文件的下载基于某些平安战略需求停止身份方面的辨别方可予以下载,如许的体例就会带来隐患。凡是采取的体例或许是将文件放置在Web可会见目次之外的办事器文件体系中或存储进数据库体系--都需求一个复杂的法式获得文件内容并直接前往给收回恳求的用户(这个中触及到一些HTTP输入头的成绩请注重,供应一个PHP文件取代详细叙说)。在体系设计时针对分歧的需求可以采取响应的举措。

4. 客户会话session的坚持
PHP的现有版本已内置了对session的撑持,凡是项目中都利用如许的体例;一些特别需求的项目(好比散布体系)或许会采取庞杂一些的处置体例。

在客户端,凡是采取的是设置cookie以辨认特定的客户,另外一个可以敷衍不撑持cookie的客户真个办法是采取URL重写到场足够标示特定客户的字符串。从这方面来讲,采取PHP内置的session撑持最为幻想,由于它可以主动的停止客户真个FALLBACK:假如客户端撑持cookie,那末就天真烂漫;假如cookie不被撑持,就采取URL重写体例--一切都不需求开辟者干涉。假如采取其他session处置体例,或本人编写顺应需求的session库,需求注重的就是如何处置客户端存储数据的成绩--cookie仍是URL重写仍是二者统筹。

在办事器端,复杂说来只需求针对以字符串标示的每一个特定客户存储相干的数据便可--可以采取的体例多种多样,凡是的体例是文件和数据库。PHP内置的session撑持中,默许的撑持体例是在体系的一时目次或制订的目次下为每一个客户创立一个文件存储其数据;固然也能够修正设置使其撑持数据库的体例或其他体例。假如本人编写session库,依据体系的需求选择一种适合的存储体例便可。值得指出的是,关于散布体系,若何同享办事器真个session信息是需求极大存眷的。

别的,在设置session变量的时分,PHP内置的session库撑持对象作为变量值(实践上一切的变量值,不管是普通的变量仍是数组或是对象,都在经由串行化以后被存储),也就是说,以下代码是可用的:





这一点关于上文提到的一些商用体系是无益的:起首,可使用关于用户的对象作为一个session变量值存储一套信息,而不是割裂的多个session变量;其次,假如具有相似购物车的功效,可以以十分合适全部体系设计的体例(即前文所述商用体系的设计体例,强调类封装)将该购物车对象放入session中。

5. ……其他和特定项目有关的功效点……
假如能在体系设计阶段就预感并处理这些功效点当然很好,即便有大批未发明的功效点遗留到了编码阶段也其实不恐怖--凡是如许的漏掉其实不会影响全部体系的架构,只是需求前往设计阶段到场响应的内容和文档便可。究竟关于相干项目经历不太丰厚的体系剖析员来讲,做到设计阶段对这类功效点了然于胸是不太实际的。

关于其他
关于PHP的争辩夙昔良多,不外自从Java在Web方面的优势愈来愈进入人们的视野以后,如许的争辩倒消声匿迹了--看来人人都告竣了共鸣--PHP关于严谨的商用体系仍是力所不及。不外基于此就一味否认PHP在商用体系中的使用也不大客不雅,究竟PHP还具有低本钱的优势(这里的本钱包含开辟本钱、利用本钱和保护本钱)。本文的目标除讲述一些PHP体系设计的办法以外,也但愿吸引一些开辟者或企业采取PHP构建适合的商用体系。

别的,本文仅仅是我本人的一些经历,假如您看到这里时分已有了本人的一些设法,我十分愿意与您分享--可以推进如PHP如许无贸易撑持的开源软件的开展,究竟是一件十分使人高兴的工作。(从这方面来讲,我乃至想撰写关于PHP开辟的文档材料和示范项目,就好像Sun Microsystems为J2EE宣布的Blueprint和Java Pet Store--惋惜临时遭到工夫、精神和团体才能的限制--或许春节假期是一个好机会:)

参考材料

本文中说起的文章和代码
代码:用户登录实例(包含掌握页面index.php,login.php;网页模板member_index.dwt,member_login.dwt;逻辑类Member.inc.php)相干附件;
代码:类封装实例(Item类界说Item.inc.php;Item_List类界说Item_List.inc.php)相干附件;
代码:上载实例(掌握页面add.php,attach.php)相干附件;
代码:下载实例(掌握页面download.php)相干附件;
代码:实例代码组织中的两个全局文件(config.inc.php,security.inc.php)相干附件;
文章:关于PHP的将来;
文章:模板在PHP中的利用。
其他参考材料
PHP官方网站--http://www.php.net
包括软件和文档和利用情形等(本文成文时的比来意向是PHP 4.1.0释出,在某些方面有较大改善)。
为PHP供应贸易撑持的Zend公司--http://www.zend.com
包括PHP相干的东西和文字材料(可以寻觅到一些与本文主题相干的话题)。
有名的开放源码项目网站SoureForge--http://www.sourceforge.net
开放源码项目标会萃地,并供应基于Web的各类便当东西(可以寻觅到不计其数PHP撰写的项目)。
把例子全部敲进去试验,完成一遍以后就会有心得了,因为你会发现为啥我的程序和书上的一模一样就是结果不正确。新手学习的时候必须承认,不容易,因为我也是过来人,你会发现原来有那么多常用的语句,函数都要记。

再现理想 发表于 2015-2-4 13:09:08

多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。

兰色精灵 发表于 2015-2-28 03:44:18

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

爱飞 发表于 2015-3-8 09:42:59

我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:

愤怒的大鸟 发表于 2015-3-8 16:46:38

首先我是坚决反对新手上来就用框架的,因为对底层的东西一点都不了解,造成知识上的真空,会对以后的发展不利。我的观点上手了解下框架就好,代码还是手写。当然啦如果是位别的编程语言的高手的话,这个就另当别论啦。

老尸 发表于 2015-3-10 08:12:53

你很难利用原理去编写自己的代码。对于php来说,系统的学习我认为还是很重要的,当你有一定理解后,你可你针对某种效果研究,我想那时你不会只是复制代码的水平了。

不帅 发表于 2015-3-14 18:12:53

当然这种网站的会员费就几十块钱。

灵魂腐蚀 发表于 2015-3-17 19:07:25

最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。

柔情似水 发表于 2015-3-24 19:27:38

小鸟是第一次发帖(我习惯潜水的(*^__^*) 嘻嘻……),有错误之处还请大家批评指正,另外,前些日子听人说有高手能用php写驱动程序,真是学无止境,人外有人,天外有天。

小女巫 发表于 2015-3-29 05:02:50

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

精灵巫婆 发表于 2015-4-11 11:52:22

实践是检验自己会不会的真理。

仓酷云 发表于 2015-4-19 15:43:37

不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。

金色的骷髅 发表于 2015-4-29 04:24:20

在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。

萌萌妈妈 发表于 2015-5-5 05:40:16

首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。

小魔女 发表于 2015-5-6 22:10:56

使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的

admin 发表于 2015-6-14 20:59:22

真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,

透明 发表于 2015-6-16 20:36:05

本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。

飘灵儿 发表于 2015-6-25 21:47:20

写的比较杂,因为我也是个新手,不当至于大家多多指正。

蒙在股里 发表于 2015-6-28 22:43:31

其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。

海妖 发表于 2015-7-7 01:00:32

Ps:以上纯属原创,如有雷同,纯属巧合
页: [1]
查看完整版本: PHP网页设计用封装类来公道的设计PHP项目--谈PHP项...