从 PHP 迁移到 ASP.NET

简介

本文讨论了从PHP(PHP:HypertextPreprocessor4)到ASP.NET的迁移,并对PHP和Microsoft®VisualBasic®.NET的基本语法以及基本功能和体系结构进行了对比。

尽管使用PHP和ASP.NET都可以构建复杂的Web应用程序(例如电子商务站点、Intranet和企业门户),但两者之间却存在若干重要差别。与PHP不同,ASP.NET并不是一种语言或分析器,而是Microsoft.NETFramework中的一组用于构建Web应用程序和XMLWebService的技术。同PHP一样,MicrosoftASP.NET页面在服务器上执行并生成标记(例如HTML、WML或XML),标记将发送给桌面应用程序或移动应用程序。但不同的是,ASP.NET为开发Web页面提供了强大的、面向对象的以及由事件驱动的编程模型,同时仍保留了PHP开发人员所习惯的那种简单性。

ASP.NET应用程序是基于强大的面向对象编程(OOP)模式,而不是基于脚本模式。这样便可以获得更为严谨的OOP功能,例如继承、封装和反射。虽然大多数基本的简单操作可以轻松地从PHP转换到ASP.NET,但要转换更为复杂的应用程序却并不这么简单,这需要仔细的规划和考虑,并采用更符合OOP的方法。

本文假设读者具有PHP方面的经验,并且对编程和软件开发有着基本了解。本文首先从代码方面对两者的基础体系结构的差别进行简单比较,并简要介绍一下OOP开发模型,然后比较两者的功能,最后将使用PHP和ASP.NET开发Web应用程序时的语法和常见任务作以对比。

注意: 如果您希望跳过有关迁移的详细信息,而只想尝试ASP.NET的使用,则可以直接跳到 建议的后续操作部分。
体系结构对比

阅读完本文后,通过比较语法和语言,您将了解PHP和ASP.NET是很相似的,它们具有类似的功能和语法。但是,从更基本的体系结构层面来讲,PHP与ASP.NET却有着很大差别。PHP基于独立于平台的处理器/引擎,该处理器/引擎用于分析PHP脚本、提供数据库连接、符合Internet协议以及提供大多数Web应用程序平台所常见的众多其他任务。

ASP.NET是基于一系列技术(如CLR)构建的框架,提供了大量以很好的方式组织的类库,这些类库可满足要在Web应用程序中使用的大多数功能的需要。您还可以轻松地创建各种组件,对该框架进行扩展。

虽然PHP也提供了类似的功能(例如PEAR库),但PHP和ASP.NET并非完全相同,因为ASP.NET框架是完全基于OOP模式和OOP概念构建的,而PHP则不然。这种差别在PHP和ASP.NET中类和对象的访问方式方面表现得犹为明显。

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本身支持企业技术,例如消息队列、事务(请参阅.NETFramework的System.EnterpriseServices类)SNMP和Web服务,因而可以很容易地开发具有高度可缩放性的强大的应用程序。

要大致了解面向对象编程(从VisualBasic的角度)的主要概念,请参阅 功能 PHP ASP.NET 编码语言 具有旧ASP样式标记的C、C++样式脚本语言。支持某些OOP概念。 支持超过25种语言,但最常用的两种语言是VisualBasic.NET和C#。大多数开发人员都选择一种语言,但可以使用用任何其他支持的语言编写的组件。 编译的应用程序逻辑 可编译并且可以作为可执行程序运行。 在动态编译和预编译模式下均支持。 全部页面输出缓存 本身并不支持。 支持,基于一个或多个URL参数、浏览器类型、自定义函数或任意组合来缓存页面的不同版本。 部分页面输出缓存 本身并不支持。 通过使用用户控件提供内置支持。可使用缓存API和复杂的过期规则来缓存数据和其他对象。 数据库访问 为市场上的大多数数据库以及开放源代码的数据库提供了驱动程序。 直接支持OLE-DB和ODBC,本身还包含了MicrosoftSQLServer™和Oracle的驱动程序。 数据库输出 数据集作为PHP变量返回,并且可以像任何其他变量那样将其输出。 以模板化的方式绑定到服务器端控件以简化开发;如果需要,也可以手动循环。 外部组件 可以调用各种软件包,并且开发人员可以直接修改Zend引擎(因为它是开放源代码的)。负责Zend的编程人员还可以使.NET对象能够从PHP中调用。 充分支持本身的C库和COM对象以及用任何与.NET兼容的语言(包括托管C++[ManagedC++])编写的程序集。对CORBA对象或Java类未提供内置支持。 XML/XSLT 在附加软件包和库中支持 为XMLDOM、XSLT、验证和XML文档的轻量级面向流的分析提供了广泛和易于使用的支持。 XMLWebService 当前正在开发PHP软件包以支持基于ApacheAXIS引擎以及其他引擎的Web服务。 当前版本提供了广泛、灵活、符合标准的支持,使得发布和使用Web服务都非常容易。 会话状态 基于Cookie的会话管理 基于Cookie或无Cookie的会话状态(使用单个服务器内存存储、中央状态服务器或数据库后端)。此外,可扩展的体系结构还允许使用自定义的会话状态模块替换内置选项。要启用无Cookie的会话,只需更改配置。 内置功能 PHP的内置功能涵盖了基于Web的应用程序可能需要执行的许多常见任务。通过某些额外的处理,它还可以访问Java类库。 ASP.NET可以直接访问整个.NETFramework类库,这些类库包含了大量功能。 正则表达式 支持POSIX和Perl兼容的正则表达式语法。 支持Perl-5兼容的正则表达式,以及一些其他功能,例如从右向左匹配、预编译表达式、命名组及完全的Unicode支持。此外,还允许用户指定在正则表达式替换操作过程中调用的函数。 调试 PHP未提供广泛的调试功能,但可以通过各种第三方产品和Zend增强调试和测试功能。 包含广泛的跟踪和环境信息,这些信息可包含在页面中或在单独的页面中显示。使用MicrosoftVisualStudio®.NET除了可以调试客户端脚本和SQLServer存储过程外,还可以轻松地在执行页面时对其进行交互式调试。 错误处理 不支持错误捕获,但提供了各种错误处理功能和日志。 支持结构化的异常处理(其中新增了一个“finally”代码块,无论是否发生错误,都将执行该块),支持引发自定义异常,还支持为不同类型的不可恢复错误指定自定义错误页面。 图像处理 无内置支持,但可以使用第三方组件。 包含大量用于创建和处理图像的工具。(请参阅.NETFramework的 代码重用 用户定义的函数、创建类的功能以及包含文件。 用户控件、服务器控件、自定义类以及包含文件。 线程 PHP具有很好的线程模型。 完全支持。不但可以在单独的线程中同时请求多个页面,而且每个页面(如果需要)还可以生成自己的线程以执行同步或异步操作。 数据缓存 具有有限的数据缓存(仅限于数据本身)。 包含大量的缓存API,能够存储几乎任何类型的数据(包括数据库查询结果),并且能够基于时间、使用情况、文件或其他缓存项而过期。还允许在从缓存中删除给定项时调用用户定义的函数。 国际化 完全支持Unicode。 支持Unicode字符串和各种字符编码。日期、数字和货币函数均可区分文化环境,并根据当前文化环境的设置更改输出(而不要求调用其他函数)。支持使用资源文件对应用程序进行动态本地化。 SMTP、HTTP、FTP、POP3 本身支持各种Internet协议。 SMTP支持依赖于IISSMTP服务。能够很好地支持HTTP。.NET不支持FTP和POP3,但是有一些免费的和销售的第三方组件可用来实现此功能。 集成开发环境 可以使用大量提供了广泛功能的开发工具,价格从零到几百美元不等。 Microsoft提供了一个名为 VisualStudioDeveloperCenter。

其他工具(包括BorlandC#Builder和MacromediaDreamweaverMX)也支持ASP.NET。

Web服务器支持 支持几乎所有Web服务器。 支持IIS以及 操作系统支持 支持几乎所有常用的操作系统,包括MicrosoftWindows®、Mac、OSX、Amiga、Solaris、FreeBSD、Linux以及AIX等。 当前支持Windows2000、WindowsXP和WindowsServer2003。 语法和常见任务对比

以下各部分比较了PHP和.NET的语法,并介绍了如何完成某些非常常见的编程任务。

注释

PHP允许您使用C、C++和Unixshell样式语法在代码中插入注释,注释指示器中的任何内容都不会被执行。

一般来讲,要在ASP.NET中注释出VisualBasic.Net代码,需要使用 <%--打开注释块,并使用 --%>关闭注释块。

表2显示了这两种环境中的注释。

表2:服务器端注释

PHP ASP.NET /*

这是被注释出的

文本块

*/

<%--

这是注释

--%>

变量

虽然PHP和VisualBasic.NET具有类似的语言构造,但语法却截然不同。由于VisualBasic.NET是基于OOP模型构建的,因而变量的声明要比PHP中变量的声明更严谨(在PHP中声明变量时只需在变量名之前添加一个 $符号)。

在VisualBasic.NET中声明变量时,要指定它的变量名和特性。变量的声明语句是 Dim关键字。它的位置和内容决定了变量的特性。变量具有级别(例如局部变量和模块变量)、数据类型、生存期以及可访问性。

虽然这种方法最初看上去要比在PHP中指定变量复杂,但实际上它会给开发人员带来方便。ASP.NET致力于帮助开发人员创建可靠的应用程序,而指定数据类型可以使诸如变量清理、调试、异常和错误处理以及代码维护等任务变得更加简单。

表3显示了在两种环境中声明变量的示例。

表3:变量声明

PHP VisualBasic.NET $head_count

$foo

$X

$obj

Dimhead_countASInteger

DimfooAsString

DimXasDate

DimObjasobject

声明数据类型

声明语句中的 AS子句用于定义所声明变量的数据类型或对象类型。您可以为变量指定以下任意类型:

  • 基本数据类型,例如 Boolean、 Long或 Decimal
  • 复合数据类型,例如数组或结构
  • VisualBasic或其他应用程序中的对象类型或类,例如 Label或 TextBox

      您可以在一个语句中声明多个相同类型的变量而不必重复数据类型。下面的语句将变量 numStudents 、 numGTA和 numProfessors声明为 Integer类型:

      DimnumStudents,numGTA,numProfessorsASInteger'三个变量都是Integer类型。
       

      有关数据类型的详细信息,请参阅 Object-OrientedProgramminginVisualBasic。

      声明生存期

      变量的生存期是指变量可供使用的时间段。使用 Dim语句声明的局部变量仅在其执行过程中存在。过程终止时,该过程的所有局部变量都将消失,这些变量的值也将丢失。

      生存期这个概念很有用,因为它使开发人员在创建应用程序时不必考虑在大型应用程序中出现的许多问题,例如有效的内存管理。通过为变量选择正确的生存期,可以使.NET对未在使用的变量执行清理操作。

      有关生存期的详细信息,请参阅 Scope。

      声明可访问性

      .NET支持变量的可访问性,从而使开发人员可以控制哪些代码能够访问特定的变量。例如,如果要为某个公式设置一些常数,并且要确保这些常数不会被它们所在类以外的其他代码更改,则可以使用private按如下所示声明该变量:

      PrivatemyConstantAsInteger
       

      变量的可访问性由声明语句中使用的一个或多个关键字 Dim、 Public、 Protected、 Friend、 ProtectedFriend或 Private确定。开发过程中通常只使用public和private。

      您可以使用上述任意关键字来声明模块、结构、类或实例变量。过程中只允许使用 Dim关键字,并且可访问性始终为private。

      输出

      PHP中输出数据的典型方式是使用 echo()语言构造。ASP.NET中与此最相似的是 Response.Write()方法(或 <%=%>构造,它只是 Response.Write()的简写形式)。表4显示了向页面写入值的基本语法。

      表4:基本输出

      PHP VisualBasic.NET <?php

      $hello="hihowareyou/n";

      echo$hello;

      ?

      >

      <%

      DimHelloAsString="Hihowareyou"&vbcrlf

      Response.Write(Hello)

      %>

      然而,这些用于向浏览器发送输出的方法主要是为了保持与传统ASP的向后兼容性。ASP.NET提供了新的基于控件且面向事件的模型,您只需在服务器控件上设置属性即可将数据输出到浏览器中。通过这种技术可以将布局与代码清楚地分开,从而简化了维护工作,并且在复杂情况下所需的代码要比PHP少得多。

      <scriptlanguage="VB"runat="server">SubPage_Load(senderAsObject,eAsEventArgs)TheDate.Text=DateTime.NowEndSub</script>Thecurrentdateis:<asp:Labelid="TheDate"runat="server"/>
       

      此示例声明了一个名为 TheDate的服务器端标签( Label)控件,并在该页面的 Load事件中将此标签的 Text属性设置为当前的日期和时间。此代码的HTML输出与其他两个版本相同,不同的是 Label控件将自身呈现为 span标记(其中包含所设置的任何标签文本)。

      条件处理

      IF/ELSE

      PHP具有若干条件处理表达式,例如 for、 while、 switch和 foreach,但最常用的是 if/else表达式。VisualBasic.NET有几个非常类似的构造,其语法也很类似。表5对PHP和VisualBasic.NET中的等价条件逻辑进行了比较。

      表5:基本条件逻辑

      PHP VisualBasic.NET if($a>$b){

      print"aisbiggerthanb";

      }elseif($a==$b){

      print"aisequaltob";

      }else{

      print"aissmallerthanb";

      }

      Ifa>b

      Response.write("aisbigger

      thanb")

      ElseIfa=bThen

      Response.write("aisequalto

      b")

      Else

      Response.write("aissmaller

      thanb")

      EndIf

      切换

      切换语句是大多数编程语言的常见语言构造,用于通过多个值对单个表达式进行测试。它常用于替换包含多个 elseif/else块的 if语句。

      图6对PHP的switch语句与VisualBasic的 SelectCase语句进行了比较。

      表6ÿ
    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 打赏
      打赏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包

    打赏作者

    晓梦庄子

    你的鼓励将是我创作的最大动力

    ¥1 ¥2 ¥4 ¥6 ¥10 ¥20
    扫码支付:¥1
    获取中
    扫码支付

    您的余额不足,请更换扫码支付或充值

    打赏作者

    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值