- ·上一篇文章:从 PHP 迁移到 ASP.NET(3)
- ·下一篇文章:从 PHP 迁移到 ASP.NET(1)
从 PHP 迁移到 ASP.NET(2)
PHP 和 ASP.NET 中的面向对象编程
虽然 PHP 和 ASP.NET 都为应用程序开发提供了 OOP 模式,但它们对各种 OOP 概念(例如封装和多态)的支持却存在差别。例如,PHP 仅支持部分封装(例如,支持在类中声明方法和字段)和部分多态(没有重载和抽象)。此外,由于 PHP 的类中不存在私有 (private)、公有 (public) 或受保护 (protected ) 函数等概念以及重载,因此 PHP 也不支持这些概念及其访问。OOP 纯粹主义者可能会说,ASP.NET 以及各种语言也没有完全支持 OOP 模式中的所有概念,对于使用 OOP 的大多数语言(如 C++ 和 Java)来说,情况确实如此。
这既有积极的一面,也有消极的一面。消极的一面是:对于某些 Web 开发人员来说,学习 ASP.NET 要比学习 PHP 困难些,因为 PHP 提供的是开发人员创建 Web 站点时所惯用的脚本模式。但是,使用过 OOP 语言和/或 V 的开发人员会发现 ASP.NET 比较亲切且易于学习。
ASP.NET 支持 OOP 概念的积极的一面是,ASP.NET 应用程序的大多数部分都会得到很好的设计,并且能够对内容、逻辑和数据进行清楚的分隔,因而从应用程序生命周期的长远角度看,这通常更容易为其提供支持。此外,由于 ASP.NET 本身支持企业技术,例如消息队列、事务(请参阅 .NET Framework 的 System.EnterpriseServices 类)SNMP 和 Web 服务,因而可以很容易地开发具有高度可缩放性的强大的应用程序。
要大致了解面向对象编程(从 Visual Basic 的角度)的主要概念,请参阅 Object-Oriented Programming in Visual Basic。
编译
PHP
请求 PHP 页面时,HTML 和内联 PHP 脚本将编译为 Zend Opcode(Zend 操作代码)。Opcode 是低级的二进制指令,是提供 PHP 页面时实际使用的代码。编译后,Zend 引擎将运行 Opcode(与 Java 的运行时引擎运行字节码类似),然后生成 HTML 并提供给客户端。
有许多商业产品可用来通过优化这些 Opcode 来加快 PHP 页面的执行速度。其他提高 PHP 脚本性能的方法还包括对 Opcode 和生成的 HTML 进行缓存。
ASP.NET
当向 IIS(Internet 信息服务)或其他 Web 服务器请求 .aspx 页面(或 ASP.NET 支持的任何其他扩展名)时,该请求将被传递到 ASP.NET 进行处理。如果是第一次请求该页面,ASP.NET 会将其编译为 MSIL(Microsoft 中间语言)。然后,CLR(公共语言运行库)会将此 MSIL 代码转换为机器码。最后使用这个编译后的代码运行该请求。后续的请求将使用相同的机器码运行(假设该页面未被修改)。
需要注意的是,因为由 CLR 生成的二进制代码已经最大限度地进行了优化,所以不必再使用其他产品来帮助提高性能。
此外还要注意,ASP.NET 中的所有内容在运行前都被编译为机器码。甚至 HTML 文本也被转换为字符串常值控件,并按照适当的顺序插入到控件树中。
功能对比
表 1 对 PHP 和 ASP.NET 中的某些主要功能进行了比较。
表 1:PHP 和 ASP.NET 的功能对比
功能 PHP ASP.NET
编码语言 具有旧 ASP 样式标记的 C、C++ 样式脚本语言。支持某些 OOP 概念。 支持超过 25 种语言,但最常用的两种语言是 Visual Basic .NET 和 C#。大多数开发人员都选择一种语言,但可以使用用任何其他支持的语言编写的组件。
编译的应用程序逻辑 可编译并且可以作为可执行程序运行。 在动态编译和预编译模式下均支持。
全部页面输出缓存 本身并不支持。 支持,基于一个或多个 URL 参数、浏览器类型、自定义函数或任意组合来缓存页面的不同版本。
部分页面输出缓存 本身并不支持。 通过使用用户控件提供内置支持。可使用缓存 API 和复杂的过期规则来缓存数据和其他对象。
数据库访问 为市场上的大多数数据库以及开放源代码的数据库提供了驱动程序。 直接支持 OLE-DB 和 ODBC,本身还包含了 Microsoft SQL Server™ 和 Oracle 的驱动程序。
数据库输出 数据集作为 PHP 变量返回,并且可以像任何其他变量那样将其输出。 以模板化的方式绑定到服务器端控件以简化开发;如果需要,也可以手动循环。
外部组件 可以调用各种软件包,并且开发人员可以直接修改 Zend 引擎(因为它是开放源代码的)。负责 Zend 的编程人员还可以使 .NET 对象能够从 PHP 中调用。 充分支持本身的 C 库和 COM 对象以及用任何与 .NET 兼容的语言(包括托管 C++ [Managed C++])编写的程序集。对 CORBA 对象或 Java 类未提供内置支持。
XML/XSLT 在附加软件包和库中支持 为 XML DOM、XSLT、验证和 XML 文档的轻量级面向流的分析提供了广泛和易于使用的支持。
XML Web Service 当前正在开发 PHP 软件包以支持基于 Apache AXIS 引擎以及其他引擎的 Web 服务。 当前版本提供了广泛、灵活、符合标准的支持,使得发布和使用 Web 服务都非常容易。
会话状态 基于 Cookie 的会话管理 基于 Cookie 或无 Cookie 的会话状态(使用单个服务器内存存储、中央状态服务器或数据库后端)。此外,可扩展的体系结构还允许使用自定义的会话状态模块替换内置选项。要启用无 Cookie 的会话,只需更改配置。
内置功能 PHP 的内置功能涵盖了基于 Web 的应用程序可能需要执行的许多常见任务。通过某些额外的处理,它还可以访问 Java 类库。 ASP.NET 可以直接访问整个 .NET Framework 类库,这些类库包含了大量功能。
正则表达式 支持 POSIX 和 Perl 兼容的正则表达式语法。 支持 Perl-5 兼容的正则表达式,以及一些其他功能,例如从右向左匹配、预编译表达式、命名组及完全的 Unicode 支持。此外,还允许用户指定在正则表达式替换操作过程中调用的函数。
调试 PHP 未提供广泛的调试功能,但可以通过各种第三方产品和 Zend 增强调试和测试功能。 包含广泛的跟踪和环境信息,这些信息可包含在页面中或在单独的页面中显示。使用 Microsoft Visual Studio® .NET 除了可以调试客户端脚本和 SQL Server 存储过程外,还可以轻松地在执行页面时对其进行交互式调试。
错误处理 不支持错误捕获,但提供了各种错误处理功能和日志。 支持结构化的异常处理(其中新增了一个“finally”代码块,无论是否发生错误,都将执行该块),支持引发自定义异常,还支持为不同类型的不可恢复错误指定自定义错误页面。
图像处理 无内置支持,但可以使用第三方组件。 包含大量用于创建和处理图像的工具。(请参阅 .NET Framework 的 System.Drawing 类。
虽然 PHP 和 ASP.NET 都为应用程序开发提供了 OOP 模式,但它们对各种 OOP 概念(例如封装和多态)的支持却存在差别。例如,PHP 仅支持部分封装(例如,支持在类中声明方法和字段)和部分多态(没有重载和抽象)。此外,由于 PHP 的类中不存在私有 (private)、公有 (public) 或受保护 (protected ) 函数等概念以及重载,因此 PHP 也不支持这些概念及其访问。OOP 纯粹主义者可能会说,ASP.NET 以及各种语言也没有完全支持 OOP 模式中的所有概念,对于使用 OOP 的大多数语言(如 C++ 和 Java)来说,情况确实如此。
这既有积极的一面,也有消极的一面。消极的一面是:对于某些 Web 开发人员来说,学习 ASP.NET 要比学习 PHP 困难些,因为 PHP 提供的是开发人员创建 Web 站点时所惯用的脚本模式。但是,使用过 OOP 语言和/或 V 的开发人员会发现 ASP.NET 比较亲切且易于学习。
ASP.NET 支持 OOP 概念的积极的一面是,ASP.NET 应用程序的大多数部分都会得到很好的设计,并且能够对内容、逻辑和数据进行清楚的分隔,因而从应用程序生命周期的长远角度看,这通常更容易为其提供支持。此外,由于 ASP.NET 本身支持企业技术,例如消息队列、事务(请参阅 .NET Framework 的 System.EnterpriseServices 类)SNMP 和 Web 服务,因而可以很容易地开发具有高度可缩放性的强大的应用程序。
要大致了解面向对象编程(从 Visual Basic 的角度)的主要概念,请参阅 Object-Oriented Programming in Visual Basic。
编译
PHP
请求 PHP 页面时,HTML 和内联 PHP 脚本将编译为 Zend Opcode(Zend 操作代码)。Opcode 是低级的二进制指令,是提供 PHP 页面时实际使用的代码。编译后,Zend 引擎将运行 Opcode(与 Java 的运行时引擎运行字节码类似),然后生成 HTML 并提供给客户端。
有许多商业产品可用来通过优化这些 Opcode 来加快 PHP 页面的执行速度。其他提高 PHP 脚本性能的方法还包括对 Opcode 和生成的 HTML 进行缓存。
ASP.NET
当向 IIS(Internet 信息服务)或其他 Web 服务器请求 .aspx 页面(或 ASP.NET 支持的任何其他扩展名)时,该请求将被传递到 ASP.NET 进行处理。如果是第一次请求该页面,ASP.NET 会将其编译为 MSIL(Microsoft 中间语言)。然后,CLR(公共语言运行库)会将此 MSIL 代码转换为机器码。最后使用这个编译后的代码运行该请求。后续的请求将使用相同的机器码运行(假设该页面未被修改)。
需要注意的是,因为由 CLR 生成的二进制代码已经最大限度地进行了优化,所以不必再使用其他产品来帮助提高性能。
此外还要注意,ASP.NET 中的所有内容在运行前都被编译为机器码。甚至 HTML 文本也被转换为字符串常值控件,并按照适当的顺序插入到控件树中。
功能对比
表 1 对 PHP 和 ASP.NET 中的某些主要功能进行了比较。
表 1:PHP 和 ASP.NET 的功能对比
功能 PHP ASP.NET
编码语言 具有旧 ASP 样式标记的 C、C++ 样式脚本语言。支持某些 OOP 概念。 支持超过 25 种语言,但最常用的两种语言是 Visual Basic .NET 和 C#。大多数开发人员都选择一种语言,但可以使用用任何其他支持的语言编写的组件。
编译的应用程序逻辑 可编译并且可以作为可执行程序运行。 在动态编译和预编译模式下均支持。
全部页面输出缓存 本身并不支持。 支持,基于一个或多个 URL 参数、浏览器类型、自定义函数或任意组合来缓存页面的不同版本。
部分页面输出缓存 本身并不支持。 通过使用用户控件提供内置支持。可使用缓存 API 和复杂的过期规则来缓存数据和其他对象。
数据库访问 为市场上的大多数数据库以及开放源代码的数据库提供了驱动程序。 直接支持 OLE-DB 和 ODBC,本身还包含了 Microsoft SQL Server™ 和 Oracle 的驱动程序。
数据库输出 数据集作为 PHP 变量返回,并且可以像任何其他变量那样将其输出。 以模板化的方式绑定到服务器端控件以简化开发;如果需要,也可以手动循环。
外部组件 可以调用各种软件包,并且开发人员可以直接修改 Zend 引擎(因为它是开放源代码的)。负责 Zend 的编程人员还可以使 .NET 对象能够从 PHP 中调用。 充分支持本身的 C 库和 COM 对象以及用任何与 .NET 兼容的语言(包括托管 C++ [Managed C++])编写的程序集。对 CORBA 对象或 Java 类未提供内置支持。
XML/XSLT 在附加软件包和库中支持 为 XML DOM、XSLT、验证和 XML 文档的轻量级面向流的分析提供了广泛和易于使用的支持。
XML Web Service 当前正在开发 PHP 软件包以支持基于 Apache AXIS 引擎以及其他引擎的 Web 服务。 当前版本提供了广泛、灵活、符合标准的支持,使得发布和使用 Web 服务都非常容易。
会话状态 基于 Cookie 的会话管理 基于 Cookie 或无 Cookie 的会话状态(使用单个服务器内存存储、中央状态服务器或数据库后端)。此外,可扩展的体系结构还允许使用自定义的会话状态模块替换内置选项。要启用无 Cookie 的会话,只需更改配置。
内置功能 PHP 的内置功能涵盖了基于 Web 的应用程序可能需要执行的许多常见任务。通过某些额外的处理,它还可以访问 Java 类库。 ASP.NET 可以直接访问整个 .NET Framework 类库,这些类库包含了大量功能。
正则表达式 支持 POSIX 和 Perl 兼容的正则表达式语法。 支持 Perl-5 兼容的正则表达式,以及一些其他功能,例如从右向左匹配、预编译表达式、命名组及完全的 Unicode 支持。此外,还允许用户指定在正则表达式替换操作过程中调用的函数。
调试 PHP 未提供广泛的调试功能,但可以通过各种第三方产品和 Zend 增强调试和测试功能。 包含广泛的跟踪和环境信息,这些信息可包含在页面中或在单独的页面中显示。使用 Microsoft Visual Studio® .NET 除了可以调试客户端脚本和 SQL Server 存储过程外,还可以轻松地在执行页面时对其进行交互式调试。
错误处理 不支持错误捕获,但提供了各种错误处理功能和日志。 支持结构化的异常处理(其中新增了一个“finally”代码块,无论是否发生错误,都将执行该块),支持引发自定义异常,还支持为不同类型的不可恢复错误指定自定义错误页面。
图像处理 无内置支持,但可以使用第三方组件。 包含大量用于创建和处理图像的工具。(请参阅 .NET Framework 的 System.Drawing 类。
