`
wenrunchang123
  • 浏览: 251197 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

(转)PHP面向对象和PHP面向过程的优缺点评比

 
阅读更多

    面向对象与面向过程在许多编程语言中只能使用二者之一来进行编程,但是PHP语言与其他编程语言有不同之处,那就是我们可以自由的选择或者将PHP面向对象和PHP面向过程二者混用。目前绝大多数PHP程序员使用面向过程的方式,因为解析Web页面本身就非常“过程化”(从一个标签到另一个标签)。在HTML中嵌入过程处理代码是很直接自然的作法,所以PHP程序员通常使用这种方式。

 

  如果你是刚接触PHP,用PHP面向过程的风格来书写代码很可能是你唯一的选择。但是如果你经常上PHP论坛和新闻组的话,你应该会看到有关“对象”的文章。你也可能看到过如何书写面向对象的PHP代码的教程。或者你也可能下载过一些现成的类库,并尝试着去实例化其中的对象和使用类方法--尽管你可能没有真正理解这些类为什么可以工作,或者为什么需要使用PHP面向对象的方法来实现功能。

 

  应该使用“面向对象”的风格还是“面向过程”的风格?双方各有支持者。像“对象是低效的”或“对象非常棒”这样的议论也时有耳闻。本文不尝试轻易判定两种方法的哪种具有绝对的优势,而是要找出每种方法的优缺点。

 

  如果你想了解一些“面向对象”的基本知识,请使用Google搜索,网络上有非常多精彩的文章。

  谁像这样写代码?

  为了理解为什么这个论题成为论坛上口水战的导火线,我们看一些每个阵营的比较极端的例子。我们看看“过程狂热”和“对象狂热”。看看他们的观点听起来是不是有点熟悉。

  过程狂热

  过程狂热曾在上课时被计算机教师批评,因为这种方法没有使用更加抽象的实现方式。而支持PHP面向过程者的观点“它可以工作!”并不能提高其编程水平和档次。毕业后他们可能找到一个工作,写驱动程序,文件系统或其它的偏向底层的编程,他们的注意力集中于速度和代码的精炼。

  “过程狂热”极端的例子是抵制对象,抵制抽象化。他们总在想着如何让程序运行起来更快,而不在乎别人是否能读懂他们的代码。他们常常把编程当成竞赛而不是团队活动。除了PHP外,他们最喜爱的编程语言是C和汇编。在PHP世界中他们可能会开发PECL模块,贡献出高效率的代码。

  对象狂热

  对象狂热者热衷于在任何时候使用PHP面向对象的风格来书写代码。他们没有真正考虑过用这种方式是否会影响程序的执行效率。有时候让人觉得他们更享受抽象的设计概念而不是现实的代码。他们通常很可能是项目管理者或文档书写者。

  对象狂热者指出,如果没有抽象的设计方法我们仍然在使用0和1进行编程。他们喜欢用伪码来描述问题。极端的例子是对象狂热者即使知道有时候会牺牲效率仍然使用对象。除了PHP,他们最喜欢的语言是Java和Smalltalk。在PHP世界中,他们可能会开发PEAR模块,贡献文档化非常好,易于维护的代码。

  不要偏激和讽刺

  你知道为什么论坛上总是充斥着各种偏见吗?你的经验阅历,你对新事物的态度都可能是原因。作为程序员,我们需要时常注意这些偏见并以开放的心态去学习新事物。

  你的编码倾向?

  考虑一下当你书写PHP代码时有什么偏好或倾向。通常这些偏好是比较隐晦的。有时候你可能在每个项目中有着同样的偏好。我个人倾向于“优雅”,但我不想在此定义如何才是“优雅”的代码,那应当出现在另一篇文章里。但是,理论化的偏好不一定适合于实际项目—相反地,他们常常是一种偏见。

  理论化的倾向

  ?用最少行数的代码提供一个完整的解决方案

  ?在问题层次上考虑问题

  这听起来似乎很不错。但“代码行数最少”如何来衡量呢?要把代码注释算在内吗?我们是否要把每一行都串起来而只用分号来区分呢?大括号呢?很明显这种想法是错误的。

  再解释一下什么是“问题层次”。这是否意味着在我们的方案中的每个概念都需要建立一个类?或者需要在每个独立的文件里保持问题的每个部分,并建立一个复杂的文件树来与现实中的问题相对应?就是这样的想法--为每个想法准备一个文件或类!

  很明显这些概括极端化后变得可笑。但现实中存在更微妙的证明。是否常常会有程序员在团队合作时插入一行复杂的,强大的但没有注释的代码?这对于接手维护这些代码的人来说无疑是非常令人沮丧的事。相反地,是否你的官僚的自以为是的上一级程序员常常“横冲直撞”般地,建立接口和类?而那些接口和类不仅仅限制了负责实现的程序员,也限制了效率和灵活性,导致客户要求扩展程序时手足无措。这些都是以上各种倾向的微妙的证明。

  实际倾向

  一个项目开始的时候,首先要寻求实际的编码目的和方向。这个项目的实现目标是什么?下面是可能是答案。

  1.开发快,发布快

  2.尽可能快地运行

  3.易于维护,改进和扩展

  4.发布一个API

  第一、二个方向倾向于使用过程化的风格,而最后两个倾向于使用PHP面向对象的风格。

  什么时候某种方式更有效?

  现在让我们试着评价每种方式在现实中的优势。

  PHP面向过程案例

  有关PHP的面向过程化编程优势的一个基础性的论据是:PHP是一个解释性的语言--这意味着,不像其它的语言一样,它不会被编译成一个可执行的包,而是被解释并马上执行。它是一种脚本语言并存储于文本文件中(例外的,如果使用了Zend编译工具)。

  另一个反对在PHP4及更低版本中使用面向对象方式进行编码的理由是:在PHP的早期版本中对象的功能并没有经过良好设计。就像Rasmus曾说过的:“那是事后才想起要增加的功能”。这意味着在PHP4及更早的版本中,对象的效率是个问题。但PHP5出来后,这种情形会有改观。

  以下两个最流行的PHP程序--OsCommerce和PhpMyAdmin.主要使用面向过程的编码方式。它们构建起来很快,运行起来也很快。两者都很自然地采用嵌入HTML的方法。

  OsCommerce

  OsCommerce实际上使用了很多对象,但绝大部分功能是通过“过程”来实现的。我曾经hack过OsCommerce,为其增添一些对于客户非常实用的自定义功能。这个过程是挺麻烦的,因为OsCommerce中的很多过程代码,没有使用模板化的系统,并且设计成多语言版,所以需要花一定的时间才能上手。但是它可以工作,事实上它已经很好地运行在数目众多的电子商务站点上了。OsCommerce同时提供了一个论坛和一个开发框架用来开发模块和插件。因此,现在已经有了很多其它开发者提供的实用的功能模块。

  PhpMyAdmin

  PhpMyAdmin直接使用的类只有一个:MimerSQLValidator类,依赖于PEAR包中的Mail_Mime,Net_DIME和SOAP。这可能是考虑到开发的方便:利用现成的可以实现目的的代码。除此之外,一切都是面向过程的,HTML和PHP代码也是混杂在一起。

  PhpMyAdmin是我几乎每天都要用到的一个工具,用来对少量的数据表进行不太复杂的处理。有时我甚至鼓励我的客户将它当作后端的管理工具来使用(当然我会限制他们的权限)。PhpMyAdmin的表现非常棒,也很快。有时我想在一些项目中扩展PhpMyAdmin作为后端的管理工具,利用它的一些新功能如数据查询语句书签可以很方便地展示给我的客户和编辑。随着每个新版本的推出,PhpMyAdmin越来越实用,功能越来越强大。 软件开发网

  PHP面向过程小结

  以上两个使用面向过程风格的程序都有非常好的文档和代码注释。OsCommerce提供的开发框架可以增加维护性和扩展性。但是两者都没有提供API,不能扩展程序到另外的体系中。

  如果你想把OsCommerce整合到一个帐单程序中,需要花费大量的时间和精力,就像扩展PhpMyAdmin成一个供客户使用的后端管理工具。不过从它们设计的目的来看,确实在各自的领域中都表现地很出色。

  PHP面向对象案例

  支持面向对象风格者的观点都集中于扩展性和封装。仅仅用面向对象的方式来写代码不会为你的代码产生文档,但它可以鼓励你为之添加文档。并且,为了易于扩展,你可能会写一个API。PHP5许诺让面向对象编程更加愉快。我开玩笑地将它称为PHP中的”Java2”版本,因为它整合了Java中的许多特性,像接口,面向对象模型,try-catch语句等。但即使在对面向对象支持不

  力的PHP4中,仍然出现了许多出色的面向对象应用程序。

  Smarty

  Smarty用来构建带有复杂表单并基于模板的站点。最近,我写了一个可以完全换“皮肤”的在线考试系统—可以不用改变任何底层的代码和功能就可以将整个站点的外观界面和风格完全改变。为了让设计师可以易于设计新的界面,我设计了一个自定义的标签库作为Smarty标签库的扩展。可以像这样简单地插入:

  [navigationhorizontalseparatedby"|"]

  在一个页面的顶端有分隔开的导航。因为Smarty已经提供了非常强大的机制来表现变量中包含的数据,这是一个映射较复杂的Smarty标签到skin标签的简单过程。

  由于Smarty封装成一个类,并且它的方法都有很详尽的文档,使得使用模板的过程变得令人难以置信地易于扩展。同时,通过强制性地只能显式地传递你要使用的变量给Smarty模板的方法,Smarty也为PHP的环境变量提供了一个保护层。这种方法有助于在Smarty模板设计师和程序员间建立安全、可靠的工作关系。

  FPDF

  FPDF是一个非常优秀的工具。如果你被改来改去的pdflib的API所困惑,或者不愿为商业化的解决方案而交钱;或者由于共享主机的限制,无法使用扩展模块—请考虑使用这个免费的,纯PHP构建的PDF生成工具。

  这个类有很好的文档,包括许多很好的例子来阐述如何在PDF中布局文本和图片。在上面提到的同一个在线学习站点我使用FPDF来动态生成PDF文件,使用truetype字体和300dpi精度的图像。在PHP中实例化FPDF类并进行PDF操作并不会花费太多额外的时间,因为PDF本身就可能需要花费几分钟来下载。事实上,动态生成并传送一个PDF所花的时间不比当使用一个慢速的网络连接来传送静态PDF文件所花的时间多。这都是相对而言的。并且,由于FPDF是基于类的,他可以被扩展。事实上,有些类方法虽然存在但还没有完全实现,仅作为一个框架,这可以为你在子类中建立你自己的内容(如自定义的头尾元素)提供向导。

  PHP面向对象小结

  Smarty和FPDF都提供了带有良好文档的API来扩展主类。这说明了在类的内部组织方法和数据的必要性--有时同样的功能可以用函数和全局变量来完成,但这样不易于扩展。并且,使用对象对跟踪和保持PDF或HTML文档的风格非常有帮助,你可以将同样的数据用不同的格式来发布。Smarty和FPDF都是使用对象来建立灵活实用的类库的极好的例子。

  为什么两种方式都是必需的?

  回到我们充满热情的程序员身上,我们开始赞美他们:

  1.我们欣赏Smarty和FPDF的实用性和扩展性

  2.我们欣赏osCommerce和phpMyAdmin的运行速度和良好表现

  这种欣赏还包括对PHP的一些基础开发。PECL和PEAR都收到了很多赞扬和批评。我想这两个项目为阐明PHP面向过程和面向对象编程的区别提供了很好的例子。

  PECl提供了PHP的扩展库,用C和面向过程的方式开发,注重速度和简洁精炼。通常,这些都是从已经存在的LGPL软件中移植而来,其中许多有趣的特性已经加入PHP。毕竟,PHP是用C写的。

  PEAR则贡献了很多有趣的类如建立Excel表或改变DNS记录等。使用PEAR类库可以为你节约大量时间,甚至可以让你在不怎么熟悉PHP的情况进行开发—“我不理解但它能用!”。

  总结

  希望本文能加深你对PHP面向对象和PHP面向过程的两种编程方式的理解,并且更重要地—鼓励你在更具体的细节上进行探索。我希望你会有自己的想法,并在实际开发中检验你的项目开发倾向,总结出更多实际的案例,并不啬写些针对本文的评论。

  总之,每种方式都有其优势的一面,纠缠于争论不如离开去写些实际的代码!

分享到:
评论

相关推荐

    从PHP看面向对象和面向过程的优缺点评比

    ### 从PHP视角探讨面向对象与面向过程编程的优缺点 #### 一、引言 在软件开发领域,编程范式的选择对项目的成功至关重要。PHP作为一种广泛应用的脚本语言,在Web开发领域尤其受到青睐。本文将从PHP的角度出发,...

    关于学校优质课评比活动总结模版模板.rar

    学校优质课评比活动总结模版可能包括标准的标题、活动背景、目标、过程、结果分析和结论等部分。 4. 优质课评比:这是教育质量评估的一种方式,旨在激励教师提高教学质量,促进教学创新。评估通常基于教学设计、...

    chemicalororganicfarming优质课评比PPT课件.pptx

    chemicalororganicfarming优质课评比PPT课件.pptx

    chemicalororganicfarming优质课评比学习教案.pptx

    chemicalororganicfarming优质课评比学习教案.pptx

    小学英语组优质课评比方案.doc

    【小学英语组优质课评比方案】是望谟县民族小学为推动课堂教学改革,提升英语教师教学能力和专业化发展而设立的一项教学竞赛。以下是该方案的主要内容和相关知识点: 1. **指导思想**:方案以新课程教学理论为基础...

    《初中化学市级优质课评比》评课稿.pdf

    《初中化学市级优质课评比》评课稿.pdf

    高中英语优质课评比获奖PPT课件.pptx

    在高中英语的优质课评比获奖PPT课件中,主题围绕着“安全食品”、“绿色食品”以及“有机食品”。有机农业是这个课件的重点,它强调了使用自然肥料而非化学肥料种植作物的重要性。有机农业不仅关注农作物的生产,更...

    中学优质课评比活动报告总结.doc

    中学优质课评比活动报告总结.doc

    评比文明班系统

    "评比文明班系统"是一款专为学校设计的教育管理软件,旨在优化教学评估流程,提升教师教学质量,并且有助于促进校园文化建设。系统的核心功能是通过对各专业课程和教师的评价,来量化并展示每位教师的教学能力和综合...

    基于PHP实现的新媒体分享、统计及评比系统设计源码

    该项目是一款基于PHP开发的新媒体分享、统计及评比系统源码,共计306个文件,涵盖262个PHP脚本文件,以及少量Markdown文档、Git配置文件、图像文件、模板文件和配置文件等。系统旨在提供全面的新媒体内容分享、数据...

    餐饮美食点评网站PHP程序(类似大众点评网)

    【标题】"餐饮美食点评网站PHP程序(类似大众点评网)" 涉及的主要知识点是构建一个基于PHP的在线餐饮评价平台,它模仿了大众点评网的功能和用户体验。这样的系统通常包括用户交互、商家信息展示、餐饮评价、推荐系统...

    讲课用的小组评比工具

    总结来说,"讲课用的小组评比工具"是一款强大的教学辅助软件,它将评分过程变得简单而高效,为教师提供了更全面、更公平的评价手段,同时也促进了学生的主动学习和团队合作。在信息化教育时代,这样的工具无疑能极大...

    人物投票评比系统

    通过SQL查询,开发者可以轻松地获取和分析数据,比如统计每个候选人获得的票数,或者查找特定时间段内的投票趋势。 系统的设计可能包括以下几个关键模块: 1. 用户模块:用户注册、登录,以及查看个人信息。 2. ...

    优质资料(2021-2022年收藏)实验小学数学青年教师课堂教学评比方案.doc

    该文档是关于实验小学举办的一场针对青年数学教师的课堂教学评比方案,旨在推动教师们遵循新课标理念,提升教学技能和专业素养,提高数学教学质量。以下是对文档中涉及的知识点的详细说明: 1. 指导思想:这次评比...

    第九章_校园十大优秀青年评比问题_Outstanding!_chooseold_十大青年_校园十大优秀青年评比问题_

    在本题目中,我们面临的是一个与数据结构和算法相关的编程挑战,具体是"校园十大优秀青年评比问题"。这是一个常见的编程练习,旨在考察开发者处理数据、实现排序和选择算法的能力。下面我们将深入探讨这个问题的各个...

    威宁县草海镇教育管理中心关于举行初中数学优质课评比大练兵活动方案.docx

    8. 评比要求:教师需使用普通话和多媒体教学,提交相关材料,参与说课、议课和教学经验分享,促进教学交流和提升。 9. 材料提交:参评教师需要提供评选活动的方案、时间安排和总结等材料,以证明其教学质量。 10. ...

    数据结构课程设计——校园十大优秀青年评比

    在本数据结构课程设计中,任务是开发一个用于...通过以上设计,本系统能够满足校园十大优秀青年评比的需求,提供一个易于操作且功能完善的平台,使得学生们可以方便地提名和投票,同时系统能有效地管理和展示相关数据。

    兴隆小学卫生检查评比制度及评比细则.doc

    【兴隆小学卫生检查评比制度及评比细则】是学校为了强化校园卫生管理,培养师生良好的卫生习惯和行为规范而制定的一项重要制度。该制度旨在深化落实《小学生守则》和《小学生日常行为规范》,促进优良行为习惯的养成...

    课堂小组评比加分软件.zip

    《课堂小组评比加分软件》是一款专为教学场景设计的应用程序,旨在通过小组竞赛的方式激发学生的学习积极性和团队协作精神。这款软件以.exe可执行文件的形式提供,操作简单易用,特别适合于教师在课堂上组织活动,...

Global site tag (gtag.js) - Google Analytics