语法和常见任务对比
以下各部分比较了 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\n";
echo $hello;
?
>
<%
Dim Hello As String = "Hi how are you" & vbcrlf
Response.Write(Hello)
%>
然而,这些用于向浏览器发送输出的方法主要是为了保持与传统 ASP 的向后兼容性。ASP.NET 提供了新的基于控件且面向事件的模型,您只需在服务器控件上设置属性即可将数据输出到浏览器中。通过这种技术可以将布局与代码清楚地分开,从而简化了维护工作,并且在复杂情况下所需的代码要比 PHP 少得多。
<script language="VB" runat="server">
Sub Page_Load(sender As Object, e As EventArgs)
TheDate.Text = DateTime.Now
End Sub
</script>
The current date is: <asp:Label id="TheDate" runat="server"/>
此示例声明了一个名为 TheDate 的服务器端标签 (Label) 控件,并在该页面的 Load 事件中将此标签的 Text 属性设置为当前的日期和时间。此代码的 HTML 输出与其他两个版本相同,不同的是 Label 控件将自身呈现为 span 标记(其中包含所设置的任何标签文本)。
条件处理
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 都支持若干不同的常见循环类型。