精通 PHP 的开发者
大约 300 年前,在 1722 年,约翰·塞巴斯蒂安·巴赫写了一本书(实际上是两卷),收录了所有大调和小调的序曲和赋格曲,“为了渴望学习的音乐青年的利益和使用,特别是为了那些已经精通这项研究的人的消遣”。这部作品,《平均律钢琴曲集》,旨在展示单一乐器在所有调性中演奏的能力。同样,在本文中,我们探讨了一套在 Linux 系统上广泛可用的工具,供一位全面的 PHP 开发者使用。
自 1995 年诞生以来,PHP 发展了很多。当前的稳定版本(截至 2008 年 5 月)是 5.2.6,版本 6 正在开发中。您可以自信地说,PHP 目前被用于数百万个网站,在数百万台服务器上,并且它可能是最流行的 Apache 模块,远远超过所有其他 Web 脚本语言。除了用于生成动态网页外,它还可以用于命令行工作(我使用 PHP 进行文本文件处理,以便将数据上传到数据库)或用于服务器端脚本,提供 Web 服务和其他功能。因此,您可以放心地认为,PHP 几乎可以用于您可能需要的任何事情。
然而,大多数 PHP 开发者只使用少数开发工具。他们以真正的代码黑客风格,使用文本编辑器,通常是 vi 或 emacs,以及最基本的编程和调试辅助工具。毫不奇怪,有几种(很多)可用的工具可以帮助生成经过更好测试和调试的代码,无论您是独自工作还是作为团队的一部分工作。在本文中,我们研究了这样一种设置,它基于 Eclipse 和几个有趣的插件。当然,这不应被视为做事的唯一方式,如果您环顾四周,您会很容易找到其他 IDE(集成开发环境)和工具。本文旨在在一个方向上提供一个推动,而不是强制遵循的道路。
Eclipse 是一个集成的、可扩展的开发平台或环境。最初,它被称为 VisualAge,是为 Java 开发而创建的(主要用 Java 编写),但后来更名为 Eclipse,并扩展了其他插件,因此它可以用于更多的编程语言和开发工具——UML 图创建和数据库管理只是两个例子。
虽然最初是一个 IBM 项目,但自 2003 年以来,Eclipse 一直由 Eclipse 基金会管理,该基金会增加了几家著名的技术公司作为战略成员。Eclipse 的未来不依赖于一家公司。Eclipse 在开源软件许可证(不是 GPL,但类似)下可用,并且最终可能会使用 GPL 版本 3。据报道,当前版本的 Eclipse(3.4,也称为 Ganymede)包含超过 1800 万行代码。
由于其 Java 起源,Eclipse 不仅可以在 Linux 上运行,还可以在其他操作系统上运行,这对于针对多个机器的开发者来说是好事。国际化方面得到了照顾,并且有几种语言的翻译。最后,Eclipse 的集成方面非常重要。您可以从单个程序中使用通用的界面和风格完成所有开发(包括不仅是代码编写,还包括测试、调试、文档编写、版本控制管理等)。
从 2006 年开始,每年都有一个同步发布版本,不仅涵盖了基本的 Eclipse 包,还涵盖了许多其他与 Eclipse 相关的项目。这是一种便利,肯定有助于避免兼容性问题。这些软件包以木星的卫星命名。2006 年,它被称为 Callisto。2007 年的版本是 Europa。并且,在 2008 年 6 月,当我撰写本文时,Ganymede 刚刚发布。在本文中,我们使用了 Europa(图 1)和 Ganymede(图 2),重点是前者。
我不会介绍如何安装 PHP、Apache 或相关工具,但我会介绍如何安装 Eclipse。由于 Eclipse 的 Java 起源,首先您需要获取 Java 运行时环境 (JRE),尽管您很可能已经拥有它。我使用了已经安装的 Sun 1.6.0 版本。您可以尝试使用 IcedTea 1.7.0 版本,但我无法证明它对 Eclipse(或其他插件)的适用性。根据 Eclipse 文档,Java 1.5 应该足够好。
获取 Eclipse 并不困难。大多数发行版已经包含它,您甚至不需要访问 Eclipse 网站下载它,但您可能不会拥有最新版本。转到 Eclipse 下载站点,选择 Eclipse Classic Project(版本 3.4),并且由于整个软件包超过 150MB,请选择一个附近的镜像站点。完成该过程后,转到您下载文件的目录,并执行tar zxf eclipse-SDK-3.4-linux-gtk.tar.gz。将创建一个 eclipse 目录,如果您移动到该目录并键入./eclipse,Eclipse 将启动并运行。
您进行严肃 PHP 工作所需的第一个插件是 PHPEclipse,顾名思义,它非常贴切。PHPEclipse 自 2002 年以来就已存在,尽管当前的稳定版本 (1.1.8) 来自 2006 年,但目前正在开发 1.2 版本,并且一直在稳定更新,因此该项目仍然非常活跃。获取 PHPEclipse 很容易;只需使用 Eclipse 更新方法,并添加一个新的远程站点(请参阅“资源”)。
PHPEclipse 不仅提供基本的编辑功能,还增加了语法着色和括号匹配,以便于阅读;代码折叠,因此您可以隐藏一个块或函数;参数提示和工具提示——例如,如果您不记得 stristr() 函数的参数,一个小弹出窗口会提醒您;以及语法检查(如果您犯了语法错误,您将在错误位置获得波浪形的红色下划线和弹出帮助,图 3)。PHPEclipse 还提供调试(使用 XDebug 或 DBG)和版本控制(CSV 或 SVN)——稍后会详细介绍。
当您编辑 PHP 源文件时,几个快捷方式和功能可以加快您的速度。需要查找某个函数或变量的声明?右键单击对其的任何引用(或按 F3),您将被带到那里。如果您不确定某个 PHP 函数,按 Shift-F2 会生成一个手册——尽管您通常可以通过将鼠标悬停在函数名称上来解决问题。
对于更冗长的编码,有几个格式化功能。您只需选择任何代码部分,然后右键单击并选择“格式”,或按 Ctrl-Shift-F 即可重新缩进。您可以通过右键单击并选择“源”→“切换注释”将行转换为注释(反之亦然),并且所有选定的行都将在前面添加 //。(从现在开始,我跳过快捷方式;除非您是 Ctrl 和 Shift 的狂热爱好者,否则您可能一直都会使用鼠标菜单。)添加或删除更大的注释(例如,像这样的注释/* ... */)也很简单,只需右键单击,然后选择“源”→“添加块注释”或“删除块注释”。“重构”功能可以帮助您全局更改变量或函数名称;现在不再有理由使用马虎的名字了。
PHPEclipse 是完全可配置的。在主菜单上,转到“窗口”→“首选项”,然后选择“PHP”。您可以为您已涵盖的大多数功能(甚至更多我在此处未提及的功能)设置您自己的特定首选项,以便您可以设置项目标准。但是,如果更多的人员正在从事该项目,请确保每个人都使用相同的参数集。仅仅因为制表符配置的差异而不得不重新格式化其他人的代码是没有乐趣的。协作和版本控制插件将在下面讨论。
当您的代码准备就绪后,您将获得“运行方式...”、“调试方式...”和“分析方式...”命令。您可以创建配置文件(包括运行时参数、环境变量、目录等),并在以后单击一下即可使用它们。运行结果将显示在 Eclipse 内集成的控制台中。
您何时测试您的代码?在一切都完成后?多么古老和过时!现代开发方法建议一种迭代的工作方式,即使在实际编程完成之前,也要结合开发自动化测试用例。在实际开发开始之前就拥有可用的测试,确保了在任何更改后都能获得快速反馈,并且它还提供了设计级别的文档,因为每个测试都充当代码应执行操作的示例。更重要的是,将所有测试放在一个测试套件中,可以进行回归测试——在提交任何新代码之前,所有先前存在的测试都应该通过。如果程序员犯了任何错误,更改了函数应该工作的方式,一个设计良好的测试将捕获问题并提醒您。
这种编程方式被称为测试驱动开发 (TDD),是许多现代敏捷开发技术的一部分。基本思想很简单,即准备一个自动化测试(自动化意味着它可以自行运行,无需用户执行任何操作,这意味着每天多次运行相同的测试都不是一件苦差事),该测试执行您的代码并通过检查断言来测试其产生的结果,这些断言要么为真,要么为假。如果任何断言失败,则某些代码没有执行其预期的操作。在编写代码之前编写(或至少计划)测试,使开发者关注代码需求和模块化——两个重要的质量因素。
有几种用于测试的工具,统称为 xUnit——例如,JUnit 用于 Java 开发,cppunit 用于 C++,PHPUnit 用于 PHP 等等。虽然特定细节在逻辑上因工具而异,但实际上它们非常相似。就我们的目的而言,我们使用 SimpleTest,它是一个在 Eclipse 中提供 PHPUnit 测试的插件。
SimpleTest 以开源代码形式提供,其最新版本为 1.0.1(来自 2008 年 4 月)。您可以从 SourceForge 下载它(请参阅“资源”)并使用 Eclipse 安装它。安装和配置后,将在“运行方式...”菜单中添加一个新选项,允许您执行 PHP 单元测试。您可以单独运行测试,这样您只能测试单个例程,或者您可以构建更复杂的测试套件,这样您可以同时运行大量测试。您可能会在编码时使用单独的测试,并在上传任何代码之前使用套件测试。
测试时,将显示一个带有彩色条的简单控制台。红色表示某些测试失败(您的代码没有按预期工作),绿色表示您的代码通过了所有测试(图 4)。如果您得到红色条,您可以单击有问题的测试名称,您将被直接带到有问题的测试代码(图 5)。
由于篇幅限制,我不会详细介绍如何编写测试或使用模拟对象;请查看文档以获取更多信息。在任何情况下,对于您从事的每个项目,您都应该创建第二个平行的测试项目。(当然,也要为其使用版本控制。)习惯自动化测试需要一些时间,但回报很高,您甚至可能会像人们所说的那样,“对测试上瘾”。
如果应用上述测试技术,是否可能出现任何错误?不幸的是,有一些著名的定理表明,任何数量的测试都不能确保程序的正确性,因此时不时地,您仍然会发现自己试图弄清楚哪里出了问题。传统上,PHP 程序员使用 print 语句——通常是die(...)指令——但这是一种繁琐的方法。此外,为了查看发生了什么而更改程序(即使更改是无害的打印命令)也不是一个好主意;您可能会意外地使事情变得更糟。
虽然一些语言(特别是 Java 和 Smalltalk)一直都有相当好的调试环境,甚至允许您逐句跟踪代码、设置断点、检查变量等等,但 PHP 程序员常常发现自己处于劣势。
基本上有两种选择:XDebug 和 DBG。XDebug 已更新到 2.0.3 版本(来自 2008 年 4 月),并且完全开源。另一方面,DBG 有两个版本:免费版本(版本 2.15.5)和商业版本(版本 3.1.11)。XDebug 支持 PHP 5.3,DBG 仅支持到 5.2。但是,对于这两个程序,主要的症结是配置,这太长了,无法在此处包含(请参阅“资源”)。在您使调试器运行后,您将能够轻松地调试您的代码;遗憾的是,安装过程如此繁琐。
版本控制(也称为修订控制或源代码控制)对于大型、多开发者项目来说是必不可少的,但即使对于独立工作也提供了显着的优势。当您第一次破坏您的代码并设法恢复它,或者感谢您的 VC 系统找到您更改的内容时,您将充分体会到版本控制的价值。
基本上,所有 VC 系统都允许您存储文档并记录对其所做的更改。VC 系统允许您不仅检查任何文档的最新版本,还可以返回到以前的版本,并找出任意两个版本之间的差异。在本文的范围之外解释版本控制的所有细节。
有许多不同的版本控制程序可用:BitKeeper、Git、Mercurial、CVS 和 SVN,但并非所有这些程序都具有 Eclipse 插件。至少,CVS 和 SVN 都可以与 PHPEclipse 一起使用,但我更喜欢后者,因为它允许移动文件;CVS 不允许。
PHPEclipse 可以通过使用 Subversive 或 Subclipse 连接到 SVN 存储库。请注意,在撰写本文时,这两个插件都保证仅适用于 Eclipse 3.3 (Europa),而不适用于 3.4 (Ganymede)。安装其中一个插件后,您将能够通过右键单击项目并选择“团队”选项来下载工作副本或将您的工作与存储库同步。同步操作的结果将显示在一个单独的控制台中,通常将包含您应该下载的文件(其他人已修改它们,而您不是最新的)、您应该上传的文件(只有您修改了它们)和冲突文件。单击冲突文件将弹出一个文件比较窗口(图 6),突出显示您的代码与已上传代码之间的差异。如何合并该代码取决于您。
资源
PHP 主页:www.php.net
Eclipse 主页:www.eclipse.org
Eclipse 下载页面:www.eclipse.org/downloads
IBM 对 Ganymede 新功能的描述:www-128.ibm.com/developerworks/library/os-eclipse-ganymede
IcedTea 项目——Java 的免费实现:icedtea.classpath.org
Sun 开发者网络页面:java.sun.com
PHPEclipse:www.phpeclipse.de
PHPEclipse 最新版本更新:update.phpeclipse.net/update/nightly
PHPEclipse 完整文档:docs.schuetzengau-freising.de/modules/xdocman/index.php?doc=xo-002
The Last Craft (PHP 测试):www.lastcraft.com
SimpleTest:simpletest.sourceforge.net
SimpleTest for the Eclipse Update:simpletest.org/eclipse
PHP 调试:www.ibm.com/developerworks/library/os-debug
XDebug:xdebug.org
配置 PHPEclipse 的 XDebug:dev.phpeclipse.com/wiki/XDebug_and_PHPEclipse
DBG:dd.cron.ru/dbg
DBG 安装指南:dd.cron.ru/dbg/installation.php
PHPEclipse DGB 配置:docs.schuetzengau-freising.de/modules/xdocman/manual.php?doc=xo-002&id=sec.install_dbg&file=ch01s05.html
用于使用 Subversion 的 Subversive 插件:www.eclipse.org/subversive
Subclipse,访问 SVN 存储库的替代方案:subclipse.tigris.org
Federico Kereki 是一位乌拉圭系统工程师,在大学教学、开发和咨询工作以及撰写文章和课程材料方面拥有 20 多年的经验。他使用 Linux 已经很多年了,并在几家不同的公司安装了它。他对 Linux 机器的更好安全性和性能特别感兴趣。