2004年7月发布了PHP 5.0。此版本引入了一系列根本增强功能。也许首先其中,从根本上改善了对面向对象编程的支持。这刺激了很多对PHP社区内的对象和设计感兴趣。实际上,这是一个强化过程,开始于版本4首次使使用PHP的面向对象编程成为现实。
在本章中,我将探讨对象编码可以满足的一些需求。我非常简短总结模式演变和相关实践的一些方面。
我还将概述本书所涉及的主题。我将看以下内容:
• 灾难的演变:一个项目失败了。
• 设计与PHP:面向对象的设计技术如何在PHP中扎根社区。
• 本书:对象。模式。实践。
问题
问题是PHP太简单了。它会诱使您尝试一下您的想法,并为您带来好印象结果。您将很多代码直接写到您的网页中,因为PHP就是为此而设计的。您将实用程序功能(例如数据库访问代码)添加到可以逐页包含的文件中,并且在您知道它之前,您已经可以使用网络应用程序。
您正处于毁灭的道路上。当然,您没有意识到这一点,因为您的网站看起来很棒。它表现良好,您的客户满意,您的用户也在花钱。
当您返回到代码以开始新阶段时,将出现故障。现在您有一个更大的团队,一些更多的用户,更大的预算。然而,在没有警告的情况下,事情开始出错。好像您的项目已经中毒了。
您的新程序员正在努力理解对您来说是天生的代码,尽管也许有点拜占庭式的曲折。她花的时间比您预期的要长,因为队员。
当您发现必须更新20或结果是更多的网页。您的一位编码员有时会保存您对同一代码所做的主要更改的文件版本较早。在三天内没有发现丢失,此时您已修改了自己的本地副本。它花了一天的时间来清理混乱,牵出了另一个也在处理文件的开发人员。
由于该应用程序很受欢迎,因此您需要将代码转移到新服务器上。该项目必须手动安装,您会发现文件路径,数据库名称和密码被硬编码到许多源文件。您在移动期间停止工作是因为您不想覆盖配置更改迁移要求。估计有两个小时变成了八小时,因为有人发现做了一些涉及Apache模块ModRewrite的聪明事,现在应用程序要求这样做运行正常。
您终于启动了阶段2。一天半的一切都很好。您即将收到的第一个错误报告离开办公室。几分钟后,客户致电投诉。她的报告与第一份报告相似,但有点仔细检查发现,它是导致类似行为的另一个错误。您还记得简单的变化回到该阶段开始时,需要在项目的其余部分进行大量修改。
您意识到并非所有必需的修改都已就绪。这是因为他们是开头为,或者因为合并冲突中所讨论的文件被覆盖而省略了。你赶紧进行修改以修复错误。您急于测试这些更改,但是它们简单的复制粘贴问题,那么会出什么问题呢?
第二天早上,您到达办公室,发现一个购物篮模块已经全部倒下。晚。您在最后一刻所做的更改省略了引号,使代码无法使用。当然,在您睡觉时,其他时区的潜在客户清醒了,随时准备在您的商店花钱。您解决了这个问题,安抚了客户,并召集了另一天的团队消防。
这个关于民间编程的日常故事似乎有些过头,但是我已经看到所有这些事情都在发生一遍又一遍地。许多PHP项目从小开始就发展成怪物
由于表示层还包含应用程序逻辑,因此复制早在数据库中就开始蔓延查询,身份验证检查,表单处理等内容会逐页复制。每次需要对这些代码块之一进行更改,必须在发现代码或错误的所有位置进行更改一定会跟随
缺乏文档使代码难以阅读,而缺乏测试则使得难以理解的错误得以解决在部署之前尚未发现。客户业务性质的不断变化通常意味着代码会不断发展偏离其最初的目的,直到它执行根本不适合的任务。因为这样的代码通常演变成一个混乱的,混在一起的团块,很难(即使不是不可能)切换出来,重写其中的一部分以适应新的目的。
现在,如果您是自由PHP顾问,那么这都不是坏消息。评估和修复类似的系统这可以为六个月或更长时间提供昂贵的浓缩咖啡饮料和DVD盒套装。不过,更严重的是这类问题可能意味着企业成败之间的差异
PHP和其他语言
PHP的惊人普及意味着对它的边界进行了早期而艰苦的测试。正如您将在在下一章中,PHP从一组用于管理个人主页的宏开始起步。随着PHP的出现3,以及更大范围内的PHP 4,该语言迅速成为大型企业背后的成功力量网站。但是,从很多方面来说,PHP的早期遗迹都贯穿于脚本设计和项目管理。在某些情况下,PHP保留了作为业余语言的不公平声誉,最好适用于演示任务
大约在这个时候(大约在千年之交),新的想法正在其他编码中流行社区。对面向对象设计的兴趣激起了Java社区。由于Java是一个对象-面向语言,您可能会认为这是多余的。Java提供了更易于使用的功能与之相对,当然,但使用类和对象本身并不能确定特定的设计方法。
设计模式的概念,一种描述问题的方式,以及其实质解决方案,于1970年代首次讨论。也许恰如其分,这个想法起源于建筑领域,而不是计算机科学。到1990年代初,面向对象的程序员使用相同的技术来命名并描述软件设计的问题。关于设计模式的开创性书籍,《设计模式:元素》Erich Gamma,Richard Helm撰写的可重用的面向对象软件(Addison-Wesley Professional,1995年),拉尔夫·约翰逊(Ralph Johnson)和约翰·弗利斯赛德(John Vlissides)(此后在本书中用亲切的昵称来称呼,在四人帮),今天仍然是不可或缺的。它包含的模式是任何人都必需的第一步从这个领域开始,这就是为什么本书中的大多数模式都是以此为依据的。
Java语言本身在其API中部署了许多核心模式,但直到1990年代后期设计模式渗入了整个编码社区的意识。模式很快感染了大街书店的计算机部分,以及第一次火焰大战始于邮件列表和论坛。
您是否认为模式是交流工艺知识或在很大程度上是热空气的有力方法(而且,鉴于本书的标题,您可能可以猜出我在该问题上的立场),很难否认他们鼓励鼓励的软件设计本身就是有益的
相关主题也越来越突出。其中包括eXtreme Programming(XP),由肯特·贝克。XP是一种鼓励灵活,面向设计,高度专注的计划的项目方法和执行。
XP原则中最突出的一点是坚持认为测试对于项目的成功至关重要。测验应该是自动化的,经常运行,最好在编写目标代码之前进行设计。
XP还要求将项目分解为小(非常小的)迭代。代码和要求应始终仔细检查。体系结构和设计应该是共享且不变的问题,导致频繁修改代码。
如果说XP是设计运动的好战分子,那么适度的趋势就可以很好地体现出来。由我读过的关于编程的最佳书籍之一:The Pragmatic Programmer:From安德鲁·亨特(Andrew Hunt)和戴维·托马斯(David Thomas)的《大师之旅》(Addison-Wesley Professional,1999年)
XP被某些人视为不明智的选择,但它源于二十年来面向对象的实践。最高级别,其原理被广泛蚕食。特别是代码修订(称为重构),被当作模式的强大辅助手段。重构自1980年代开始发展,但已编纂在Martin Fowler的重构目录中,“ 重构:改进现有代码的设计(Addison-Wesley Professional),于1999年出版并定义了该领域
随着XP和模式的兴起,测试也成为一个热门问题。重要性强大的JUnit测试平台的发布进一步强调了自动化测试的重要性,成为Java程序员军械库中的关键武器。关于该主题的里程碑式文章,“测试感染: 程序员喜欢写作测试”,作者Kent Beck和Erich Gamma(http://junit.sourceforge.net/doc/testinfected / testing.htm ),对该主题进行了出色的介绍,并且仍然具有很大的影响力
PHP 4大约是在这个时候发布的,它带来了效率的提高,并且至关重要的是,增强了对对象的支持。这些增强使完全面向对象的项目成为可能。程序员采用了此功能,这使Zend创始人Zeev Suraski和Andi感到惊讶Gutmans,曾加入Rasmus Lerdorf管理PHP开发。正如您将在下一章中看到的那样,PHP的对象支持绝不是完美的。但是,只要遵守纪律并谨慎使用语法,开始同时思考对象和PHP
尽管如此,诸如本章开头所述的设计灾难仍然很常见。设计文化尚待时日,关于PHP的书籍几乎不存在。在线,但是,兴趣很清楚。Leon Atkinson在2001年为Zend写了一篇有关PHP和模式的文章,Harry Fuecks推出了他在2002年访问了www.phppatterns.com(现已不存在)的期刊。基于模式的框架项目例如BinaryCloud以及用于自动化测试和文档编制的工具开始出现
2003年第一个PHP 5 beta版本的发布确保了PHP作为面向对象语言的未来编程。Zend 2 Engine提供了大大改善的对象支持。同样重要的是,它发送了一个表示对象和面向对象的设计现在是PHP项目的核心
多年来,PHP 5不断发展和改进,并纳入了重要的新功能,例如作为名称空间和闭包。在此期间,它赢得了服务器端最佳选择的声誉。网络编程
2015年12月发布的PHP 7代表了这一趋势的延续。特别是它提供支持标量和返回类型声明-许多开发人员拥有的两个功能(以及以前的功能)这些年来,人们一直在大声疾呼。如果您不知道那是什么意思或为什么重要,请继续阅读
关于这本书
本书并不试图在面向对象设计领域中开拓新的领域。在这方面,它ches立在巨人的肩膀上。相反,我在PHP的背景下研究了一些既定的设计原则和一些关键模式(particularly those inscribed in Design Patterns, the classic Gang of Four book)。最后,我超越了代码的严格限制,着眼于工具和技术可以帮助确保项目的成功。除了介绍和简短的结论外,这本书分为三个主要部分:对象,模式和实践
对象
在第二部分中,我将快速回顾一下PHP和对象的历史,并绘制出它们从事后思考的过程PHP 3是PHP 5的核心功能。
您仍然可以是经验丰富且成功的PHP程序员,几乎不了解对象或根本不了解对象。出于这个原因,我从最初的原理开始解释对象,类和继承。即使在这早期阶段,我将介绍PHP 5和PHP 7引入的一些对象增强功能
建立的基础知识,我会更深入地探讨我们的主题,研究PHP更高级的面向对象特征。我还将专门介绍一章PHP提供的工具,以帮助您使用对象和类
但是,仅仅知道如何声明一个类并使用它来实例化一个对象还不够。您必须首先为您的系统选择合适的参与者,并确定他们进行交互的最佳方式。这些与关于对象工具和语法的光头事实相比,选择很难描述和学习。我完成第2部分介绍了PHP的面向对象设计
模式
模式描述了软件设计中的问题,并提供了解决方案的内核。“解决方案”在这里并不意味着您可能会在食谱中找到这种剪切和粘贴的代码(尽管食谱是作为程序员的资源)。相反,设计模式描述了可用于解决问题的方法一个问题。可以给出一个示例实现,但是它不如它所服务的概念重要说明
第3部分首先定义设计模式并描述其结构。我也看一些它们受欢迎的原因
模式倾向于促进并遵循某些核心设计原则。了解这些可以帮助分析模式的动机,并且可以有效地应用于所有编程。我讨论其中一些原则。我还将研究统一建模语言(UML),这是一种与平台无关的描述方式类及其交互
尽管这本书不是模式目录,但我研究了一些最著名和有用的模式。我描述每个模式都解决的问题,分析解决方案,并提出一个实现PHP中的示例
实践
如果管理不当,即使是精美的平衡架构也会失败。在第4部分中,我将介绍工具可用来帮助您创建确保项目成功的框架。如果这本书的其余部分是关于设计和编程的实践,第4部分是关于管理代码的实践。工具我检查的内容可以形成项目的支持结构,有助于跟踪错误的发生,促进程序员之间的协作,并简化了安装过程并简化了代码
我已经讨论了自动化测试的功能。我从介绍性章节开始第4部分概述了该领域的问题和解决方案
许多程序员对让自己自己做所有事情的冲动感到内gui。作曲家,与其主要存储库Packagist一起,可以访问数千个依赖项管理的程序包可以轻松地拼接成项目。我看一下自己实现功能之间的权衡并部署Composer软件包
在讨论Composer的主题时,我将介绍使一个简单的命令包,
代码是关于协作的。这个事实可能是有益的。这也可能是一场噩梦。git是一个版本控制系统,使许多程序员可以在同一代码库上一起工作,而无需覆盖彼此的工作。它使您可以在开发的任何阶段获取项目的快照,请参阅谁进行了哪些更改,然后将项目拆分为可合并的分支。Git将保存您的项目一个天
当人们和图书馆合作时,他们常常为聚会带来不同的约定和风格。虽然这很健康,但也会破坏互操作性。话犹如符合和遵守给我颤抖,但不可否认的是,互联网的创造力以标准为基础。通过服从在某些约定下,我们可以自由地在巨大的沙箱中玩游戏。因此,在新的章节中,我将探讨PHP标准,它们如何为我们提供帮助,以及我们应该如何以及为什么要遵守
似乎有两个事实是不可避免的。首先,错误通常会在相同的代码区域中重复出现,从而使某些工作日在déjàvu锻炼。其次,改进往往无法解决,甚至无法解决。自动化测试可以解决这两个问题,从而为代码中的问题提供预警系统。我介绍PHPUnit是所谓的xUnit测试平台的强大实现,该平台最初是为Smalltalk设计的,但现在已移植到多种语言,尤其是Java。我特别关注PHPUnit的功能,更一般地说,测试的好处和一些成本
应用程序很杂乱。他们可能需要将文件安装在非标准位置,或者要设置数据库,或需要修补服务器配置。总之,应用程序需要的东西在做安装。Phing是Java工具Ant的忠实端口。Phing和Ant解释构建文件和过程您以任何方式告诉您的源文件。这通常意味着将它们从源目录复制到系统中的各种目标位置,但是随着您的需求变得越来越复杂,Phing可以轻松扩展去见他们
一些公司实施开发平台,但在许多情况下,团队最终要运行一个阵列不同的操作系统。承包商携带PC笔记本电脑抵达(您好Paul Tregoing,第五版技术编辑)),一些团队成员不断地为他们最喜欢的Linux发行版(这就是我和我的Fedora)进行宣传,许多人都在购买另一本看起来很性感的PowerBook(咖啡吧和会议室使用完全不会使您看起来像是时髦的Borg军队中的另一个节点)。所有这些将运行一个LAMP堆栈程度不同。不过,理想情况下,开发人员应在紧密的环境中运行代码类似于最终的生产系统。我研究了Vagrant,这是一个使用虚拟化的应用程序这样团队成员就可以保留其特有的开发平台,但可以在类似生产的系统
测试和构建都很好,但是您必须安装并运行测试,并继续这样做为了获得好处。如果您不自动化自己的工作,很容易沾沾自喜,让事情发生变化构建和测试。我将一些工具和技术归纳为“连续”类别。集成”将帮助您做到这一点
第五版的新增功能
PHP是一种生动的语言,因此,它正在不断地进行审查和开发。这个新版本已进行审查和彻底更新,以考虑到变化和新机会。我盖新功能,例如匿名类,期待已久的标量参数提示和返回类型。示例在适当的地方使用了PHP 7功能,因此请注意,您将需要针对PHP运行代码7口译员-或准备做一些降级工作。
在以前的版本中,我包括了有关PEAR软件包存储库的一章。作曲家和包装家现在,存储库显然已经成为PHP开发的标准,我已经相应地重写了这一章
看来我已经将本书的每个其他版本的版本控制范围都切换了。我是很高兴地说,这次我坚持使用Git。但是,我花了更多时间看Git像GitHub这样的存储库,因为开发人员越来越多地使用它们
我在前面提到的“无业游民”中加入了新的篇章。在另一个新的章节中,我将研究PHP标准。既然我赞同遵守风格的价值指南中,我对本书中的每个代码示例进行了重新设计,以满足PSR-1和PSR-2标准。这是一个比我意识到的要大得多的承诺,技术编辑Paul Tregoing英勇地为我服务诚实
摘要
这是一本有关面向对象的设计和编程的书。它还涉及用于管理PHP的工具从协作到部署的所有代码库。这两个主题从不同但互补的角度解决了同一问题。首要的目的是建立能够实现其目标并很适合进行协作开发的系统。第二个目标在于软件系统的美观性。作为程序员,我们制造的机器有形状和动作。我们在工作中花了很多时间,在生活中花了很多时间来写这些形成。我们需要我们构建的工具,无论是单个类和对象,软件组件,或最终产品,以形成优雅的整体。版本控制,测试,文档和build不仅支持这个目标:它是我们想要实现的形状的一部分。正如我们想要清洁和聪明的代码,我们想要一个为开发人员和用户设计良好的代码库。的力学共享,阅读和部署项目应该与代码本身一样重要
网友评论