Oracle Technology Network (OTN) > Downloads, Discussions, and Documentation for Developers and DBAs

Sean Hull 观点

再论 PHP 与 ASP.NET
作者:Sean Hull

许多编程人员依赖于个人偏好和模糊的感觉来选择技术,而管理人员必须问不同的问题。PHP 5 均可满足二者的要求

在早先有关该主题的一篇文章“PHP 与 ASP.NET 正面交锋”中,我讨论了 PHP 和 ASP.NET,比较并对比了两种技术,并针对如何为开发项目选择最佳的技术提供了一些建议。

该讨论着实引发了一场争论。有趣的是,双方阵营里竟然都有人声称该文偏向了另一方。ASP.NET 一方的人声称该文偏向 PHP,而 PHP 一方有些人声称该文偏向了 ASP.NET。

这篇后续文章将讨论其中的一些问题,并且更详细地解释我的想法和结论。本文还更深入探讨了这两种技术,特别是讨论了新的版本,PHP 5,以及 MONO 项目。最后,本文就哪种技术最适合您的下一个基于 Web 的开发项目对这两种技术进行了比较。

更多历史背景介绍

PHP 开始时默默无闻。Rasmus Lerdorf 在 1995 年做一个项目时需要一个工具来帮助他跟踪对其 Web 页面的访问。那时,该工具只是一组脚本,但随着他不断添加功能,他用 C 重写了他的个人主页工具 (Personal Home Page Tools),增加了数据库访问并在原来的功能上进行了构建。根据真正的开放源代码传统,他选择将其工具发布到社区中。他将这个版本命名为 PHP/FI(个人主页/表单解释器),我们所知道的 PHP 就这样诞生了。

PHP 最初的语法和变量声明与 Perl 类似

那时的 PHP 受 Perl 影响很大,它的语法和变量声明都与 Perl 类似。它还有一些不一致 — 正如所有不成熟的开放源代码项目在一开始时常常表现的那样。在公开发布之后,它开始得到其他编程人员的认可,这些编程人员发现它的功能非常有用并对其作出了重要的贡献。

在 1997 年,PHP 2 向规模尚小但在不断壮大的 PHP 社区发布,不过在测试阶段拖延了一些时间。那时,它做了许多更改并添加了许多特性。快速发展可能使软件有点反复无常,而事实证明,PHP 3 的诞生甚至更加有趣。

那时,Andi Gutmans 和 Zeev Suraski 在用 PHP 2 开发一个大学电子商务应用程序。版本 2 不是非常适合,因此他们从头重写了它。很明显这个决定最初是单方面做出的,但为了将其建立在已经壮大的 PHP 用户基础上,Gutmans、Suraski 和 Lerdorf 决定联合起来,将重写后的版本发布为 PHP 3。

1998 年正式发布的 PHP 3 引入了新的可扩展性特性。这些功能吸引了许多新的开发人员并真正开辟了在社区会员之间进行协作开发的领域。到目前为止,该语言真正盛行起来,超过百分之十的互联网 Web 服务器安装了 PHP。

版本 4 与 2000 年 5 月问世,它引入了大量的新特性。新的 PHP 引擎 — 用其创造者的名字 Zend 命名 — 旨在有效地处理较复杂的应用程序,支持更多 Web 服务器,并提供诸如 HTTP 会话、新安全功能等新特性。

什么使得 PHP 5 如此特别?

2004 年 7 月发布的 PHP 5 标志着 PHP 的成熟。许多面向对象特性的增加和微调为您提供了一种更好的语言,您可以用这种语言来构建基于 Web 的复杂应用程序。

PHP 5 为您提供了一种更好的语言,您可以用这种语言来构建基于 Web 的复杂应用程序。

默认情况下,PHP 5 通过引用传递对象。为了提供按值传递的功能,PHP 有一个 clone 函数用来创建对象的拷贝(如果需要)。不过,按引用传递只是传递指针,这比复制内存结构效率高。PHP 的这个新版本扩展了面向对象的支持,例如提供了 INSTANCEOF 关键字以及更好的构造函数和析构函数,这些是在早期版本中所没有的。它还增加了私有变量和受保护的变量。私有变量在对象本身的成员函数内部可用,而受保护的变量在对象本身的成员函数、对象子类的成员函数内部可用,但在类之外的代码中不可用。

PHP 5 还引入了其他常见的 OOP 特性(例如允许您构建原型类的抽象类、防止成员函数子类化的 FINAL 关键字、定义永久性变量的 CONSTANT 关键字)。您还将发现用 TRYCATCHTHROW 语法实现的新的、复杂的异常处理。程序在执行期间出现错误意味着将抛出异常,例如,您可以在做除法时使用 TRY 来防止除数为 0 的情况。CATCH 部分可以显示一条消息:“您刚刚试图在例程 X 内除以 0,这不应该发生。”

PHP 现在还支持函数重载(不要和默认值混淆)。对于默认值,在没有为变量指定值时,PHP 将使用默认值。函数重载允许开发人员通过不同的输入变量创建同一函数的几个不同实施。这种功能的优点就是,引擎将根据您调用函数时使用的变量类型来确定在运行时您想使用哪个函数

PHP 5 很明显提供了很多功能。如果您强烈要求更好的面向对象特性,那么您将对版本 5 非常满意。如果您过去在应用程序复杂性和 PHP 功能方面受过挫折,那么 PHP 5 中的许多新的面向对象的特性将对您非常有意义。

但是,PHP 的意义不是在于避免膨胀吗?如果产生许多面向对象的代码,这不是将意味着占用更多内存并最终导致更慢的代码吗?

是但又不是。膨胀实际上在于加载了并未使用的代码(无论是自己创建的资料库还是 PHP 的一部分)。这还在于加载了不必要的数据或执行了不必要的计算。在各种情况下,您作为程序员都可以进行控制。

下面就是您能够如何避免这个问题的一个例子。假定您在使用 PHP 的 XXX 类,但只在非常特殊的情况下使用。不是将 REQUIRE 语句放在最开头(这将使代码更简洁、可读性更高),您可以将其直接放在对象的前面。如果不会执行给定的各种条件语句,则很多情况下不会触发 REQUIRE,因此也不会加载那些类。问题得到了解决。

下一步要做什么呢?

通过浏览一些相关的 PHP 项目,您可能猜到 PHP 未来的发展方向。有一个名为 PHP-GTK 的项目。为什么?PHP 是用于 Web 开发的,而 GTK 则是用于桌面客户端/服务器应用程序的。嗯,这是很奇怪的事情。您实际上可以用 PHP 编写脚本,就像您可以用 Perl 或 bash(在您的脚本头上包含熟悉的 #!/usr/bin/bash)一样。是的,您可以编写非用于 Web 的 PHP,一些人已经对此进行了讨论

因此,如果 PHP 希望发展成为一种编写桌面应用程序的语言,那么它的确可以着眼于 ASP.NET 全部功能。许多人已经注意到了 PHP 最新版本与 Java 语法之间的相似性。那么,看到 PHP 扩展到这个领域并不让人吃惊,许多变化都支持这个发展方向。

ASP.NET 的优势

好的,我们来看看 ASP.NET。在对我先前 OTN 文章的回复中,一些读者说我明显偏向 ASP.NET。总而言之,我想说,无论您想用 PHP 做什么,您几乎都可以用 ASP.NET 来做,反之亦然。在缺少某个例程的地方,可能存在两种或三种其他的方式可以做同样的事情,尽管要使用不同的代码,调用不同的库。因此,我强调“完成任务”,许可和服务器平台是您在选择 Web 技术时极为重要的考虑因素。稍后我们再对此作更多的讨论。现在我们集中讨论一下 ASP.NET。

Visual Studio .NET 很明显,ASP.NET 的一个巨大的优势是 Visual Studio .NET IDE。无论点击式编程的反对者怎么说,出色的 IDE 的确可以使编码变得非常非常容易,即使经验丰富的开发人员也可以提高效率 — 这是事实。它可以高亮显示语法,当指示错误的内容时可以一目了然,自动填充命令,或只是帮助您更好地组织代码。Visual Studio 有一个非常好的调试器。此外,您现在可以从 IDE 内部利用 Oracle Developer Tools for VS.NET 插件直接处理 Oracle 数据库对象。

无论点击式编程的反对者怎么说,出色的 IDE 的确可以使编码变得非常非常容易。

.NET 框架和标记抽象 .NET 框架的情况如何?.NET 提供了用于标记抽象的类,其背后的意义是,它处理您可能用来浏览网站的各种浏览器。想通过 PDA 或 WAP 电话进行连接吗?没问题。想通过标准的 HTML 浏览器进行连接吗?您完全可以这么做。它根据需要呈现各种标记。这可能是好事也可能是坏事(取决于您的看法)。信赖 Microsoft 能正确支持 HTML 可能将某些浏览器(例如 Firefox、Opera 或其他的 Internet Explorer 的竞争对手)置于艰难境地。另一方面,在 .NET 以及 PHP 中,您作为开发人员可以自由地编写您自己的 HTML 库,在不同的客户端上为您心仪的内容管理不同的样式表。
再次讨论读者反馈

我先前关于这个主题的文章吸引了很多的读者回复,因此我不可能全部讨论它们。不过,以下问题的确很突出。

  • 一位读者提到了 Apache::ASP,因此我对这个选项进行了一些研究。当然,如果您已经写了大量的 ASP 代码,并想将 Web 服务从 IIS 转移到 Apache 上,那么这似乎是一种可行的替代方法。但对于那些着手新开发工作的企业,使用一种非 Microsoft 支持的服务器平台在管理层可能存在一些阻力。在来自 PHP 开发人员的电子邮件中,我反复听到一种明确清晰的意见:PHP 最大的优势之一是它强大的函数库和模块。如果您想做一些事情 — 例如创建 PDF、Flash SWF 和许多图像格式以及处理电子邮件 — 那么可能已经提供了各种库来帮助您完成它们。
  • 支持 PHP 的意见中的另一个共同观点是,已经围绕 PHP 形成了一个真正的开发人员社区。这意味着将很快地发现和修复 bug。有许多关于 PHP 的专门电子邮件列表;更有社区成员创建的无数资料库,用它们几乎可以做一切事情。
  • 我已经提到了,许可是帮助您决定采用哪种技术的一个重大因素,但一些读者意见引发了进一步的争论以及对这个问题的重视。一种意见认为您需要为服务器购买许可,这就够了 — 因此开发人员可以在他们的客户端计算机上安装 ASP.NET。但这样会导致隐性成本,即如果您要在旧版本 OS 上安装最新的 ASP.NET 或 IIS,则必须首先升级 OS,这无疑将增加您的成本。实际上,您的 OS 不会像在开放源代码世界中那样可以使用很长时间。或者假定您有大量的 Win2000 服务器,而现在要增加一台新的服务器。该服务器附带最新版本的 OS,如 Win2003。您的应用程序将无法在该异种部分上运行。毫无疑问,您将不得不升级旧的服务器以利用更新的 IIS 和 ASP.NET 版本。
  • 经常被强调的还有 IDE 问题,因此我将在这里再提一下它。.NET 的集成编译环境为 Visual Studio,它包含一个非常好的调试器和编辑器以及其他许多有用的工具。这对开发人员而言无疑是一个巨大的帮助,但公平地讲,PHP 也有集成编译环境,如 Zend Studio,不过它不是免费的。它还有大量出色的特性。此外,PHP 还有各种其他开放源代码的编辑器和调试器可以使用,分别如 PHP EDIT 和 DBG。

编译的代码与 PHP 解释的代码 .NET 将代码(例如 C#)编译成 MSIL(即 Microsoft 中间语言,由其创建者命名)。这与 Java 的字节码 — 源代码编译后获得的“二进制文件” — 大致相似。PHP 作为一种解释语言,在方面实际上没有对等性可言。我使用引号是因为它与编译 C、C++ 等时得到的二进制文件不同。在那些情况下,将编译成一种您处理器特有的机器语言 — 实质上是只有您的处理器能够理解的编码指令。在 Mac OS X 编译器上编译的 C 程序产生的代码与同一程序使用 Linux C 编译器编译产生的代码是不同的。通过字节码或 MSIL,您将获得一个可执行文件,但如果没有运行时环境,则该文件将无法直接在任何计算机上运行。这就是 Microsoft 的 .NET 通用语言运行时 (CLR) 的用处所在。该层将在不同的平台上有不同的实施,以执行那些二进制文件,并在执行时将它们转换成机器语言。

如果说 PHP 是严格解释的而 ASP.NET 代码是编译的,则有点误导 — 正如我刚刚介绍的通用语言运行时环境所证实的那样。此外,通过 PHP 以及 ASP.NET 页面,您可以配置您的各个 Web 服务器来执行这些页面的连接池和高速缓存,因此不需要每次都重新编译它们。毫无疑问,PHP 页面将编译成比等价的 ASP.NET 页面更小的部分,这是因为 CLR 中间编译的开销更大。最后,这将导致 Web 服务器产生更高的内存需求。

MONO 的情况怎么样? MONO 是一个开放源代码项目,它将 .NET 服务器技术应用到非 Microsoft 的平台上,例如 Linux、HP-UX、Solaris 和 Mac OS X。.NET 不只是一个 Web 应用程序开发框架,这个项目的目的是将该框架以开放源代码的形式提供。虽然 Microsoft 开始接受共享源代码模式,在这种模式中,一些开发合作伙伴可以获得源代码,但它将非常昂贵并且保留了许多封闭源代码的限制。开放源代码模式仍然保证没有限制,并鼓励定制和重新发布。

MONO 本身作为一个开发平台是非常有价值的。有可能 Microsoft 将修改规范或者作一些未披露的更改,虽然它已表现出对 .NET 其他实施的兴趣。不过,同样没有来自 Microsoft 的真正支持。

在 ASP.NET 领域中,我们实际上更多讨论的是 mod_mono — 为 Web 服务实施 MONO 的 Apache 模块。与 MONO 项目本身类似,该项目仍在开发之中,还不是 ASP.NET 框架的一个已完成的实施。因为 MONO 仍在开发之中,并且依赖于许多没有完全实施 Win32 平台的库,所以将 MONO 看作进行 Web 开发的除 PHP 和 ASP.NET 外的第三种选择要更保险一些,而它与 ASP.NET 有许多共同点。因此,它提供了 .NET 的许多功能和框架,包括一个 C# 编译器,但它不是 Microsoft 支持的开发环境。您依赖于社区来开发代码(并间接地依赖于支持该项目的 Novell)。这样,它在 Web 开发方面与 PHP 有了很多共同点,您可以选择 Apache 作为 Web 服务器,将 mod_mono 构建为一个模块(与 PHP 类似),并回避与 Windows 服务器上的传统 ASP.NET 开发相关的所有许可问题。

忍痛割爱时最要紧的是什么

您再次面临两难境地:您需要从两种相互竞争的环境和技术中做出选择。当然,编程人员将倾向于满足日常需求。他们将倾向于问如下这些问题:提供了什么类型的库,开发体验怎么样?是否有 IDE,调试器有多好?我能否容易地完成工作?所有这些问题都很重要,许多编程人员依赖对特定语言、技术以及过去体验的个人偏好和模糊的感觉来选择技术。

不过,管理人员将问不同的问题:招聘使用这种语言的编程人员有多困难?许可问题怎么样?在这种平台上进行开发是否能保证企业的安全性?它会不会削弱其他基础架构的安全性?服务器维护起来是否经济高效?我可以期望获得什么样的运行时间?

底线是 PHP 5 的发布,PHP 成为比以前更有吸引力的一种技术,它为您提供面向对象的特性,用以构建大型、基于 Web 的复杂应用程序,并包含了高效完成工作的工具。此外,您使您的 Web 服务器成为运行 Apache 的坚固、可靠的基于 Linux 的服务器,从而为您带来高性能和无可比拟的运行时间。

接下来的步骤
阅读 PHP 漫游者指南(系列)
开放源代码开发人员中心了解关于 PHP 的更多内容


Sean Hull 是的公司 iHeavy Inc. 的高级顾问,该公司位于纽约市。他专注于开放源代码技术与商业技术(如 Oracle)的集成,并已服务于多家成功的纽约公司。
E-mail this page
Printer View Printer View