从 PHP 迁移到 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 具有很好的线程模型。 完全支持。不但可以在单独的线程中同时请求多个页面,而且每个页面(如果需要)还可以生成自己的线程以执行同步或异步操作。
数据缓存 具有有限的数据缓存(仅限于数据本身)。 包含大量的缓存 API,能够存储几乎任何类型的数据(包括数据库查询结果),并且能够基于时间、使用情况、文件或其他缓存项而过期。还允许在从缓存中删除给定项时调用用户定义的函数。
国际化 完全支持 Unicode。 支持 Unicode 字符串和各种字符编码。日期、数字和货币函数均可区分文化环境,并根据当前文化环境的设置更改输出(而不要求调用其他函数)。支持使用资源文件对应用程序进行动态本地化。
SMTP、HTTP、FTP、POP3 本身支持各种 Internet 协议。 SMTP 支持依赖于 IIS SMTP 服务。能够很好地支持 HTTP。.NET 不支持 FTP 和 POP3,但是有一些免费的和销售的第三方组件可用来实现此功能。
集成开发环境 可以使用大量提供了广泛功能的开发工具,价格从零到几百美元不等。 Microsoft 提供了一个名为 ASP.NET Web Matrix 的免费 ASP.NET 开发工具。
最常用的工具是 Visual Studio.NET,它为所有 .NET 语言、用于创建 SQL 以及测试数据库的数据库工具、Web 设计工具、与版本控制的集成、高级调试功能以及许多其他功能提供了充分的支持。要获得完整的功能列表,请访问 MSDN® Visual Studio Developer Center。
其他工具(包括 Borland C# Builder 和 Macromedia Dreamweaver MX)也支持 ASP.NET。
Web 服务器支持 支持几乎所有 Web 服务器。 支持 IIS 以及 Covalent 的商业版 Apache 2.0。
操作系统支持 支持几乎所有常用的操作系统,包括 Microsoft Windows®、Mac、OS X、Amiga、Solaris、Free BSD、Linux 以及 AIX 等。 当前支持 Windows 2000、Windows XP 和 Windows Server 2003。
语法和常见任务对比
以下各部分比较了 PHP 和 .NET 的语法,并介绍了如何完成某些非常常见的编程任务。
注释
PHP 允许您使用 C、C++ 和 Unix shell 样式语法在代码中插入注释,注释指示器中的任何内容都不会被执行。
一般来讲,要在 ASP.NET 中注释出 Visual Basic .Net 代码,需要使用 <%-- 打开注释块,并使用 --%> 关闭注释块。
表 2 显示了这两种环境中的注释。
表 2:服务器端注释 PHP ASP.NET
变量
/*
这是被注释出的
文本块
*/
<%--
这是注释
--%>
虽然 PHP 和 Visual Basic .NET 具有类似的语言构造,但语法却截然不同。由于 Visual Basic .NET 是基于 OOP 模型构建的,因而变量的声明要比 PHP 中变量的声明更严谨(在 PHP 中声明变量时只需在变量名之前添加一个 $ 符号)。
在 Visual Basic .NET 中声明变量时,要指定它的变量名和特性。变量的声明语句是 Dim 关键字。它的位置和内容决定了变量的特性。变量具有级别(例如局部变量和模块变量)、数据类型、生存期以及可访问性。
虽然这种方法最初看上去要比在 PHP 中指定变量复杂,但实际上它会给开发人员带来方便。ASP.NET 致力于帮助开发人员创建可靠的应用程序,而指定数据类型可以使诸如变量清理、调试、异常和错误处理以及代码维护等任务变得更加简单。
表 3 显示了在两种环境中声明变量的示例。
表 3:变量声明 PHP Visual Basic .NET
声明数据类型
$head_count
$foo
$X
$obj
Dim head_count AS Integer
Dim foo As String
Dim X as Date
Dim Obj as object
声明语句中的 AS 子句用于定义所声明变量的数据类型或对象类型。您可以为变量指定以下任意类型:
基本数据类型,例如 Boolean、Long 或 Decimal
复合数据类型,例如数组或结构
Visual Basic 或其他应用程序中的对象类型或类,例如 Label 或 TextBox
您可以在一个语句中声明多个相同类型的变量而不必重复数据类型。下面的语句将变量 numStudents、numGTA 和 numProfessors 声明为 Integer 类型: Dim numStudents, numGTA , numProfessors AS Integer ' 三个变量都是 Integer 类型。
有关数据类型的详细信息,请参阅 Data Types。有关面向对象编程的详细信息,请参阅 Object-Oriented Programming in Visual Basic。
声明生存期
变量的生存期是指变量可供使用的时间段。使用 Dim 语句声明的局部变量仅在其执行过程中存在。过程终止时,该过程的所有局部变量都将消失,这些变量的值也将丢失。
生存期这个概念很有用,因为它使开发人员在创建应用程序时不必考虑在大型应用程序中出现的许多问题,例如有效的内存管理。通过为变量选择正确的生存期,可以使 .NET 对未在使用的变量执行清理操作。
有关生存期的详细信息,请参阅 Lifetime。
声明范围
局部变量是在过程(过程与函数类似)中声明的变量。非局部变量是在过程之外但在类或结构中声明的变量。
在类或结构中,非局部变量的类别取决于该变量是否被共享。使用 Shared 关键字声明的变量是共享变量,它只有一个副本并且在类或结构的所有实例中共享。如果不使用 Shared 关键字,则该变量为实例变量,并且针对类或结构的每个实例都将创建一个单独的变量副本。实例变量的给定副本仅可用于为之创建该副本的实例。
变量的范围是指可以引用它而不必限定其名称的所有代码集。变量的范围取决于声明变量的位置。位于给定区域中的代码可以使用在该区域中定义的变量而不必限定其名称。声明范围时,将遵循以下规则:
共享变量或实例变量的范围是在其中声明了该变量的结构或类。
局部变量的范围是在其中声明了该变量的过程。
但是,如果您在块中声明一个局部变量,则它的范围将只限于该块。局部变量在定义它的控制块中处于活动状态。控制块可以是过程、if 语句以及循环语句等。
有关范围的详细信息,请参阅 Scope。
声明可访问性
.NET 支持变量的可访问性,从而使开发人员可以控制哪些代码能够访问特定的变量。例如,如果要为某个公式设置一些常数,并且要确保这些常数不会被它们所在类以外的其他代码更改,则可以使用 private 按如下所示声明该变量: Private myConstant As Integer
变量的可访问性由声明语句中使用的一个或多个关键字 Dim、Public、Protected、Friend、Protected Friend 或 Private 确定。开发过程中通常只使用 public 和 private。
您可以使用上述任意关键字来声明模块、结构、类或实例变量。过程中只允许使用 Dim 关键字,并且可访问性始终为 private。
输出
PHP 中输出数据的典型方式是使用 echo() 语言构造。ASP.NET 中与此最相似的是 Response.Write() 方法(或 <%= %> 构造,它只是 Response.Write() 的简写形式)。表 4 显示了向页面写入值的基本语法。
表 4:基本输出 PHP Visual Basic .NET
<?php
$hello = "hi how are you\
";
echo $hello;
?
>
<%
Dim Hello As String = "Hi how are you" & vbcrlf
Response.Write(Hello)
%>
然而,这些用于向浏览器发送输出的方法主要是为了保持与传统 ASP 的向后兼容性。ASP.NET 提供了新的基于控件且面向事件的模型,您只需在服务器控件上设置属性即可将数据输出到浏览器中。通过这种技术可以将布局与代码清楚地分开,从而简化了维护工作,并且在复杂情况下所需的代码要比 PHP 少得多。 <script language="VB" runat="server">
此示例声明了一个名为 TheDate 的服务器端标签 (Label) 控件,并在该页面的 Load 事件中将此标签的 Text 属性设置为当前的日期和时间。此代码的 HTML 输出与其他两个版本相同,不同的是 Label 控件将自身呈现为 span 标记(其中包含所设置的任何标签文本)。
Sub Page_Load(sender As Object, e As EventArgs)
TheDate.Text = DateTime.Now
End Sub
</script>
The current date is: <asp:Label runat="server"/>
条件处理
IF/ELSE
PHP 具有若干条件处理表达式,例如 for、while、switch 和 foreach,但最常用的是 if/else 表达式。Visual Basic .NET 有几个非常类似的构造,其语法也很类似。表 5 对 PHP 和 Visual Basic .NET 中的等价条件逻辑进行了比较。
表 5:基本条件逻辑 PHP Visual Basic .NET
切换
if ($a > $b) {
print "a is bigger than b";
} elseif ($a == $b) {
print "a is equal to b";
} else {
print "a is smaller than b";
}
If a > b
Response.write ("a is bigger
than b")
ElseIf a = b Then
Response.write ("a is equal to
b")
Else
Response.write ("a is smaller
than b")
End If
切换语句是大多数编程语言的常见语言构造,用于通过多个值对单个表达式进行测试。它常用于替换包含多个 elseif/else 块的 if 语句。
图 6 对 PHP 的 switch 语句与 Visual Basic 的 Select Case 语句进行了比较。
表 6:switch 与 select case 语句的对比 PHP Visual Basic .NET
switch ($i) {
case 0:
print "i equals 0";
break;
case 1:
print "i equals 1";
break;
case 2:
print "i equals 2";
break;
default:
print "i is not equal to 0,
1 or 2";
}
Select Case Number i
Case 0
description = "0"
response.write ("i equals 0")
Case 1
description = "1"
response.write ("i equals 1")
Case 2
description = "2"
response.write ("i equals 2")
Case Else
description = " i is not equal
to 0, 1 or 2"
response.write ("i is not
equal to 0, 1 or 2 ")
End Select
循环
另一个非常常见的控制构造是循环。PHP 和 .NET 都支持若干不同的常见循环类型。
表 7:For 循环 PHP Visual Basic .NET
在 Visual Basic 中,这种循环类型被称为 For...Next 循环,而在 PHP 中则称为 For 循环。在此示例中,我们使用了 += 运算符作为 sum = sum + counter 的简写方式。在 PHP 中,可以使用 Break; 语句来中断循环。而 For...Next 循环可以通过 Exit For 语句中断。
for ($i = 1; $i <= 100; $i++) {
print $i;
}
Dim sum As Integer = 0
Dim counter As Integer
For counter = 1 To 100 Step 5
sum += counter
Next
For i = 1 to 100
Response.write (i)
Next I
条件循环
只要某个条件计算为 true,条件循环便会持续重复一组指令。表 8 显示了这两种语言中的基本条件循环示例。
表 8:条件循环 PHP Visual Basic .NET
在 Visual Basic 中,这种循环类型称为 Do...Loop 语句,或 while 循环。PHP 也支持 Do...While 循环,该循环与 while 循环非常类似,不同之处在于它是在每个循环的结尾而不是开始检查真假表达式。 Do...While 循环与常规 while 循环的主要差别是前者会确保运行第一个循环(因为只在该循环的结尾检查真假表达式),而常规的 while 循环则不一定运行。(因为它在每个循环的开始检查真假表达式,如果它一开始便计算为 FALSE,该循环将立即结束执行。)
$i = 1;
while ($i <= 10):
print $i;
$i++;
endwhile;
Dim counter i As Integer = 1
Do While counter i <= 10
Response.write(i)counter i += 1
Loop
下面给出了一个 PHP 中这种情况的示例: $i = 0;
此循环只运行一次,因为在第一次循环后检查真假表达式时,表达式计算为 FALSE($i 不大于 0),所以循环将停止执行。
do {
print $i;
}
while ($i>0);
在 Visual Basic .NET 中,您可以执行同样的操作: Dim counter i As Integer = 0
但是,Visual Basic .NET 支持内置的循环功能,这是 PHP 所不支持的。该功能将对条件进行计算,直到条件为真时为止。
Do
response.write (i)counter
Loop While counter i > 0
Foreach 循环
PHP 4(而非 PHP 3)包含一个 foreach 构造,它与 ASP.NET 以及某些其他语言中的构造非常类似。它只是为循环数组提供了一个简单的途径。foreach 只适用于数组,如果试图将其用于其他数据类型的变量或未初始化的变量,则会导致错误。Visual Basic .NET 中与此等价的循环是 For Each...Next 语句。表 9 显示了在这两种语言中循环数组的示例。
本文来源:AspCool
责任编辑:王晓易_NE0011