【php精品源码栏目提醒】:网学会员为需要php精品源码的朋友们搜集整理了PHP4.0 Web开发技术指南 开发思想.pdf - 编程语言相关资料,希望对各位网友有所帮助!
下载 第一部分 高 级
PHP 第1章 开 发 思 想 命名是所有事的开始。
要真正掌握一门编程语言,不仅要理解它的语法和语义,更重要的是掌握语言所体现的哲学思想、语言产生和发展的背景以及设计特点。
1.1
PHP与我 大家是否想过,为什么会有这么多的编程语言?除了所谓“主流语言”例如 C 、C 、P a s c a l等之外,还有其他的如 L o g o l、C o b o l、F o r t r a n、S i m u l a和许多更加特殊的语言。
当列出一个项目的梗概时,大多数软件开发者不会真正地考虑到可以使用多种编程语言;他们都有自己偏爱的语言(也许是公司指定的一种语言),了解它的优点和它的缺点,并根据语言的具体特点修正项目。
但当克服所选语言的缺陷时,就可能会增加不必要的额外工作。
了解如何使用一门语言却缺乏其特定的概念知识,就好像一个开卡车的人想参加二轮马车比赛一样,当然,一般来讲他应该懂得如何驾驶二轮马车,他甚至可能在终点线上跻身前列,但他绝不可能成为一个出色的车手,除非他熟悉新车的独特之处。
类似地,当面向对象程序设计( o o p)程序员编写一个应用程序的时候,他会尽力使程序满足项目要求,处理同一个任务,不同的程序员会运用不同的方式。
哪种方式更好?每一个程序员会说他(她)的方法最好,但只有那些熟悉两种概念—o o p和过程化编程—的人能够作出判断。
前面提到的每一种语言代表一种解决问题的特定方法,这些问题多属于具有特殊要求的某一特殊种类。
因为这些语言集中在一个有限的应用领域内,他们的成功性也限制在这些领域。
像C和P a s c a l这样的语言变得如此流行,就是因为它们被广泛应用,并且它们不针对特殊问题,却提供了能很好地解决普遍问题的工具。
那么P H P是如何适应这一体系的呢?尽管它被称之为一种语言,但 P H P并不是一种真正独立的语言,而是许多语言的混和体。
它主要用 C的句法,但与 C有很大不同。
它是被解释的, P H P能识别不同的变量类型,但没有严格的类型检查,
PHP识别类,但没有结构体类型,类似的例子很多,但你可能已领会到了关键一点:
PHP融合了许多种不同的解决问题的思想,形成了一种全新的、独一无二的方法。
为了能够用 P H P成功地开发 We b应用程序,我们鼓励你首先回答下述问题: P H P是我的项目所需的理想语言吗?问得好。
如果我们说不,那我们就会显得很愚笨(谁会去写一本关于他们 2 部分第一部分分高 级
PHP 下载认为不好的东西的书呢?)。
让我们重新阐述这个问题,对项目来说有比 P H P更好的语言吗?这次我们可以很有把握地回答,如果你正在从事网络应用程序的开发,
PHP就是为你准备的最好的语言。
1.2 计划的重要性 你为什么应该阅读这一部分 即使你是一个很熟悉
PHP的职业程序员,我们也建议你阅读下面的部分,因为这里包 含了成功开发的基本知识,如果你对所讨论的题目已很熟悉,也应该花时间浏览一下, 你可能会发现新的信息—新的题观点、新的解决方法、新的答案,你对解决未来项目 的不同方面的问题了解得越多,你就能越好地抓住关键点,并且用更好的方式处理。
我 们希望你信任我们是职业开发者,并相信我们的经验,这将使你在以后受益。
在深入探讨 P H P特定问题之前,先让我们从一个更广泛的观点开始。
不论你使用什么语言,也不论你在什么平台上开发。
有一些问题在应用开发中是总会涉及到的。
当从事一个专业项目的时候,考虑一下你正在做什么是至关重要的,“了解你的敌人,永远不要低估它”。
尽管你的项目并不是一个真正的敌人,这句话的寓意仍然适用,在转向其他题目时,要知道项目的所有技术条件、目标平台、用户,并且决不要低估那些没有考虑周全的小问题的重要性。
据我们的经验,计划占用了 50的开发时间。
项目越大,它的纲要就应该越详尽。
这一原则既适用于同你的顾客相联系并与他们密切合作以确定一个总的项目概要,又适用于与你的开发者探讨确定一个编码概要。
在一致性和可维护性上花的气力越少,就越容易在重新打开旧文件并设法清除错误或添加新的特征时遇到问题。
计划所用时间与项目大小并不一定成比例,例如,想一下要设计的一个搜索算法。
这一应用程序只需要在一堆信息中进行基本的,搜索并能根据规则抽取数据,由于数据已经存在,所以创建和输出将不会需要太多的努力。
这一应用程序将把它的大部分运行时间花在搜索循环上。
这个循环也许用不了 1 0 0行代码,但是为一个优化的循环选择设计一个优化的算法很容易耗费一整天的时间,这个小小的循环也许是设计阶段最庞大的部分,但另一方面,你可以在不到一天的时间内策划好数千行的代码。
同样,我们假定需要一个小脚本来列出某个目录中的所有文件,你能够很快地完成它,使其能从事某一特定任务,在一个特定的目录列出所有文件,不必再担心它了 — 问题已解决,可以转向其他任务,把你的程序抛在脑后。
但另外一种策略是考虑一下以后的某个时间,甚至可能是在一个完全不同的项目中—你可能会再一次需要一种类似的工具,仅仅一遍又一遍地重做目录列举器,每一个对应一个特定的任务,这简直是在浪费时间。
因此,当首次遇到这种情况时,应该考虑到这一点,应从一个目录列举器中创建一个分离的模块,允许它列举不同的目录,有选择性地递推子目录,甚至允许使用通配符,你可以创建一个“防弹”函数,它即能处理大多数特例,又能完美地应付一个目录列举器的普通要求。
采用这种策略经过几个项目之后,你将拥有一个工具参数的库,可以安全地重新使用和依赖这个库,从而可以极大地减省开发时间。
下载 第1章认开 发 思 想部分 3 当然,有了一个日益增大的免费工具函数库,依然不能满足全部需要,也不能优化这个库以适应特殊需求,有些库太庞大以致不能随处安装,因为每一次选中都必须分析几百 K字节的代码,这将严重降低站点的性能。
在这种情况下,需要用 1 0 0 自己创造的优化解决方案,以取代非最优解决方案。
更大的项目如果缺乏计划将导致更多的错误,在开发后期,可能会遇到没有或无法预见的困难,这是由于缺乏计划的时间和工作,这些困难可能会严重到让你彻底地重组整个项目。
例如,对一个依赖额外数据库提取层的数据库支持的应用程序,其数据库提取层仅能接收文本数据,但后来你发现也需要用它接收数值性的数据,通过工作区转换,可以使它能够接收数值性数据。
但后来你又感觉到这个工作区仍旧不能满足需要,这时唯一能做的就是改变数据库接口,这需要重构提取层并对所有主代码调用进行检查,当然也需要清除先前创建的工作区。
这样,数小时甚至整天的工作将不得不耗费在本来从一开始就可以避免的问题上,这些问题往往决定了程序开发的成败,因为“时间是你永远都不可能充分拥有的珍贵资源”。
下面的内容将针对大部分基本的却是非常重要的开发中的实际问题进行讨论:改善代码质量以及基本设计和文件管理的问题。
陈述完这些后,我们创建一个应用程序接口( A P I),采取简单的、实用的方式使你熟悉这一新的思想,然后我们从头创建一个 A P I,在纸上从理论上开发它,并明确一些实用规则来帮助你实施下一个 API,例如风格问题、以及商业技巧等。
1.3 编码规范 好的编码和差的编码之间究竟有何区别呢?实际上,这个问题很简单。
好的代码(确实好的代码)能够像一本书一样被阅读。
你能从任何地方读起,并且能够时刻意识到你所读的这些行是干什么用的,它们在什么条件下执行,它们所要求的设置。
即使你缺乏背景知识,遇到了一个错综复杂的算法,你也能很快看出它所从事的任务,以及它的风格。
举个例子,然后说“照着做”总是很容易的,但我想这一章应该使你打下写专业化代码的坚固基础,这一基础将区分真正精心编制的代码和一个草草完成的程序段。
抱歉的是,由于篇幅所限,我们不能按我们所希望的那样详尽地讨论良好的代码书写风格的每一方面,但本章将给你一个很好的开始。
我们期望你能迅速获得专用的材料,以熟悉软件设计和工程的每一要点。
编码是一个很广的领域,几乎是一门独立的科学。
有许多论文论述它,虽然这些论文大多很乏味,很理论化,但在应用中是不可放弃的。
下面我们就最重要的问题进行最基本的讨论。
1.3.1 选择名字 选择变量名可能是程序员最常做、但却想得最少的。
如果你已建立了这些在大项目中出现的变量名字、类型、定义位置的清单,那么你就创建了一个类似于小电话簿的东西,你想让你的清单成为什么样子呢?不同的命名方案已发展起来了,它们有不同的思想及各自的优点和缺点,这些方案一般分为两类:简短的变量和函数名及谈话式的变量和函数名(描述变量类型和目的的更长的名字)。
某个电话目录可能是这个样子的,如表 1-1所示。
4 部分第一部分分高 级
PHP 下载 表1-1 电话目录 姓名 地址 电话 J.D. 382W.S -3951 M.S. 204E.R. -8382 这份列表非常有意思:该列表有两个条目,但并没有更多的信息。
人名只有首字母,没有全称;只有房间号,但没有街道名;只有电话号码的一部分,却没有完整的号码。
让我们看另外一个例子,如表 1-2所示。
表1-2 电话目录 姓 名 地 址 电 话 ht5ft9in_age32_John 386 West Street,Los 1-555-304-3951 Angeles,California, Doe_male_married USA,Earth ht5ft6in_age27_Mary 204 East Road,Los 1-555-306-8382 Angeles,California, Smith_female_single USA,Earth 在这个例子中,每个人的名字包括身高、年龄、性别及婚姻状况。
地址中不但包括街道和城市,而且也包括州、国家、甚至星球。
电话号码附加了国家和地区号。
第二种解决方案比第一种好吗?两个都不是最好的。
在程序课上讲授的这两种解决方案,都不令人满意,定义一种类型 t p I n t M y I n t e g e r C o u n t e r ,然后声明一个变量 i n s t M Y I n t e g e rC y u n t e r I n s t a n c e。
如果仅仅需要遍历一个数组并将所有元素都设为 0,这无疑显得太冗长了(见清单1-1)。
清单1-1 一个过于冗长的实例 另一方面,使用 I、j、k(而不是像 i n s t M y I n t e g e r C o u n t e r I n s t a n c e这样长的名字)也是不可接受的,尤其当我们从事的是像压缩这样复杂的缓冲操作的时候更是如此。
这只是普遍思想被误用的一个简单例子,该怎么办?解决的办法是选择好的整体思想,然后在适当的地方加以例外处理,当写一个应用程序时,应该知道你的代码从事的是什么工作,能够快速地从一点转到另一点—但其他人可能认为这并不容易。
如果你从开发组的某个人手中获得一个源文件并需要添加一些特征,首先必须对其进行整体把握,并区分代码的各个部分。
理想情况下,这一过程将和阅读源文件平行进行,但由于在没有提示和公共样本帮你理清代码来阅读的情况下,这是不可能做到的,所以在源代码中包含尽可能多的额外信息,并且使得明显的事实不易于混淆就显得很重要了。
那么如何能查知这些信息,并将其合并入自己的代码呢? 使代码更易读。
下载 第1章认开 发 思 想部分5 如果可能,选择谈话式名字。
尽可能添加一些注释。
保持清晰、一致的函数接口。
把代码结构化成逻辑群。
抽出单独代码块。
使用文件来将函数分类。
编写文档。
下面将讨论上述各主题。
1.3.2 使代码更易读 在阅读的时候,为了理解文章的含义,你的大脑必须分析从你的眼睛里获得的信息,识别出重要的部分,然后把这些部分译成正确的代码。
这个分析过程分两步执行:形式分析和逻辑分析。
首先通过检查文章的可视结构来执行形式分析,例如:检查段落、行、列甚至词之间的空隙。
这一过程打破了对文章的整体了解,将其分成更小块的树形结构。
假想一个结构严密的树,有顶部的树节和底部的树叶,树的顶部包含着最一般的信息,例如,你要读段落顺序,树的底部是诸如一行中的词序或是一个词中的字母顺序的一些东西。
逻辑分析过程将提取这些形式信息,然后按顺序遍历此树,并设法将信息译成有意义的结果,这是一种语法上的翻译(这个句子有什么样的结构?),还是一种语境式的翻译(这句话是什么意思?)在此处讨论中并不重要。
重要的是:形式分析的结果越好,逻辑分析就越容易、越快、越好。
逻辑分析能补偿形式分析中失去的信息,但仅仅是在一个有限的程度上补偿。
你也许能读懂前面的这个句子,但要花费比读本书其他句子更长的时间和更多的注意力,在第一步分析中,一些重要的信息(间距)丢失了,你并不习惯这样。
我们可以通过添加一些标点使其变得更简单易懂。
标点是进行形式分析的有用信息。
注意到阅读这一版本或把注意力集中在所选的任意一点上要容易得多。
下一步: 这是你阅读句子的常规方式,即阅读文章时最习惯的方式,但我们也可用多行结构描述这个句子: 这是可以让你能尽快地理解这个句子极端的方法的一种,上面的断句阻碍了自然的阅读语序,因为你并不习惯读一个在句法上被拆成单元的句子,但对于源代码来说,这是一个优势, 6 部分第一部分分高 级
PHP 下载因为源代码经常包含复杂的结构、公式等。
使源代码保持清晰的外在形式、结构以帮助读者理解是很重要的,这可以通过使用缩进和在适当的位置放置编程语言的关键词来实现。
让我们看一个简短的
PHP程序: 这个代码本身也许并不是智力劳动的
精品,我们只观察一下它的结构,如果以前没有读过这个片段,你能够一下就指出主代码的起始处吗?你能标记出主代码中最初的和最后的说明吗?即使你能一下子找到想找的地方,你的眼睛也会不由自主的从行首开始从左到右的浏览,在你认为目标可能在的地方停下来。
你的大脑也要重复读这一行,因为你会不时丢失形式分析得来的信息。
为了弥补起步时信息的缺乏,你的大脑(逻辑分析区)也会采取这一步,并强调两次。
正如电脑一样,你的头脑的能力是有限的。
所以,当你的大脑确实想要理解和记忆源代码时,逻辑分析区就在缺乏能力的情况下承担了额外工作。
但是理解和记忆恰恰是你想让人们在读你的源代码时所达到的,也是你在读别人的源代码时想要达到的。
因此,这就是为什么格式化源代码很有用的原因。
还有别的原因吗?噢,是的,格式好的源代码看起来让人赏心悦目。
下面是一些指导原则,其中阐述了我们所认为的在格式化源代码时的最优风格。
请注意,这些指导原则不是强制要求的,但可以认为是一般的规范,许多工业的和开放式的项目已经用这种方式将源代码格式化了。
并且,采用这种风格经常会带来收益。
块标志符( lt、gt、ltphp、lt、gt、、等等)要放在不同的行里。
用tab 缩进所有的块(理想情况下,把 tab宽度改成不超过 4的值)。
在关键词和关系对象符之间要留有空隙,特别是在进行计算时尤其要这样做。
将代码的逻辑块分别放在连续的行里,使逻辑块分组,并在块之间留有空行。
用空行的方式分隔各个块。
用空行的方式把函数头、函数脚和代码的其余部分分开输入全局变量被看作是函数头的一部分。
把每一块的注释并入代码。
在同一块内把所有行的注释放置在同样的一些列中。
作为一个例子,清单 1-2给出了某段格式化的代码。
清单1-2 重新格式化的代码片断下载 第1章认开 发 思 想部分 7 大家可以看到,这一小块代码读起来要容易得多。
在代码中,空格的使用可以进一步把参数和关键词分开: 以上看似毫无必要,不过要记住:这些代码要被嵌入几千行代码之中,所以必须改变你的观点。
有些人说在书写源代码文本时,括号之间的空隙与其说有帮助不如说分散了人们的注意力——我们必须承认,有些时候这是事实,本书中的例子也并不都使用这种格式。
我们认为,是否使用这种格式最后由你自己决定,最重要的则是:要保持一致性。
一旦你决定采用某种风格,就一定要坚持至项目的完成。
如果你在修改别人的源代码,你也要尽量遵守他们的风格。
在职业开发中,一致性是最重要的原则之一。
要注意阅读所有源程序的例子,并尽量模仿他们的风格,调整你自己的风格直至和这些最初的例子很接近为止,一旦你对这种风格很熟悉,你会发现你所做出的努力没有白费。
在进一步阐述之前,我们举两个例子来更好地说明这一点,如图 1-1和图1-2所示。
图1-1 坏的代码 图1 - 1中源代码是要建立一个 S Q L语句,除了最后的一行是把一个包含“ select ”的字符串赋给一个名为query的变量外,我们看不出图 1-1中还有什么说明了该段代码的目的。
与之相反,在图1-2中的代码中,你就比较容易理解代码的所有目的。
8 部分第一部分分高 级
PHP 下载 图1-2 好的代码 我认为代码就应该是这样,至少应该近似这样,代码应该有清楚的结构、很好的注释,并且很容易理解。
1.3.3 添加注释 我们无论怎样强调添加注释都不过分,尽管编程时你可能认为这是最微不足道的事情。
在编写高质量的代码时,注释是很重要的。
在解决复杂问题的时候,很少有两个人会有完全一样的想法,某些问题对于一个人可能是一目了然,而对于另外一个人可能是模糊不清的,在这种情况下,注释就是大有裨益的,只要需要,你都应该把它们添加到代码中。
目前主要有两种注释:头注释(例如文件头注释、模块头或函数头注释)和内部注释。
头注释主要起介绍性作用,告诉读者一个文件要做哪些事情,或下面这一大段代码是关于什么的。
内部注释用在函数内,或嵌入代码中以解释代码的某一行或某一块所做的工作。
下面介绍这些注释的外在感观及其所包含内容的概念。
现在,这些注释通常可通过快速应用开发工具( R A D)或其他授权帮助工具来产生,但由于在撰写本书时仍没有适合 P H P的类似系统,所以这些注释应该是手编的,尽管这会增加一些额外的工作量。
下面按照注释类型的抽象程度,从最抽象的到最具体的来讨论。
保持注释不断更新 要记住在编写函数之中或之前就将其注释好,仅仅为了加注释而读一个文件是非常 令人厌烦的工作。
同时,要注意在以后的某个时候如果对进行函数的修改,就要适当地 更新你的注释。
例如,若增加或去掉全局变量,那么你也要在注释中对它们的使用注释 进行更新;同样,如果参数顺序、类型等发生变化也是如此。
使用宏来加速你的注释 在你最喜欢的编辑器中,为每一种注释类型创建宏并给它们分配热键(例如,为文 件头分配CtrlAltFl,为模块头分配CtrlAltF2等等)。
下载 第1章认开 发 思 想部分9 如果编辑器支持的话,可以把变量引入注释中,这种创建详细的有大量信息的注释 工作就变成了一个创建简短对话框问题。
1. 文件头注释 文件头可以像清单 1-3那样编排 清单1-3 文件头注释 你可能偏爱使用多行注释创建的对话框,有人认为这样美观 如清单1-4所示。
清单1-4 文件头注释 (使用多行注释) 2.在UNIX中提取块注释 在UNIX系统中,下面的 grep命令从源程序中提取这样的块注释: grep / source.
php3 选择什么样的风格来格式化你的标题并不重要,但选择的由文件头包含的信息是很重要的。
就像在上面例子中所看到的,标题应该包含一些整体信息,如:关于模块作者等的细节条目.
上一篇:
基于php+mysql的在线考试系统(毕业论文doc)
下一篇:
2012邮政局信息公开总结