动态网站web开发 PHP、ASP还是ASP.NET


Posted in PHP onOctober 09, 2006

    这是一个经常被提出的问题,并且它很容易把人们带入争论Linux还是Windows的歧途。这样的争论事实上反映出了对于相互竞争的Web开发技术要进行并行分析是多么困难的一件事情,而这一难度同时因为开发人员对任何可比较操作系统的不同意见而大大增加。

    所以与其继续参与到这样的争论中,我们还不如来看看每一项技术对于特定Web开发以及运行环境所表现出的优势。尽管ASP和PHP的相似程度大于其中任意一种与ASP.NET的相似程度,我们还是要讨论ASP.NET。原因是开发人员常常将其与ASP相混淆,并且在微软的努力下ASP.NET的确会在将来完全取代ASP。

基本理论——特点概述
PHP——超文本预处理器(Hypertext Pre-processor)
PHP是开放源代码服务器端的脚本语言,在语法上同C语言非常类似。尽管最初是被设计用于基于Linux的Apache Web 服务器系统,现在的PHP已经被移植到了任何操作系统并兼容任何标准Web服务器软件。由此也可以得出PHP的三大主要优势。首先它是跨平台的技术,因此PHP应用程序可以被方便的移植——当然这还要取决于诸如厂商特定数据库等需要集成的额外组件。这样的可移植性还带来了另一方面的优势,即绝大部分的Web主机提供商都会支持PHP,因此根据需要更改主机将会非常方便。

第二点,由于PHP同C编程语言有很多相似之处,对于熟悉相关语法的开发人员来说,PHP则非常容易上手——这种语法同样在Java、JavaScript以及Perl中得到应用。第三,由于是开放源代码产品,PHP将继续快速发展,更为重要的是相关漏洞补丁将免费的定期植入到核心库中。

此外,在一些特定的编程需求下,PHP对于开发人员显示出了更为诱人的吸引力。首先,PHP有内建库支持对于图片及PDF文档的直接创建和相关操作。这意味着当一个应用程序调用包含有anti-aliased类型文本的动态创建菜单图像,或者是需要导出Acrobat格式页面时,PHP都将是解决此类问题的理想技术。尽管这些功能在理论上也可以通过其他与PHP相竞争的技术获得,但往往其他技术需要安装第三方自定义组件才能实现。

另一点使得PHP成为编写服务器脚本最佳选择的是在处理连接mySOL或者Postgres数据库一类的问题时PHP的良好表现。尽管对于mySOL或者Postgres数据库的访问可以通过ASP技术借助ODBC连接来实现,但这常常需要系统管理员进行额外的配置。幸运的是,这点限制在ASP.NET中得到了改正,当需要建立类似于使用MS SQL Server的直接数据库连接时可以通过mySQL提供数据。

ASP——动态服务页面(Active Server Pages)
微软将ASP引入Windows NT Server 4并将其作为IIS Web服务器下的动态Web应用程序的默认使用平台。由于它使用VBScript(Visual Basic语言的一个分支),ASP立即被熟悉Microsoft IDE——Visual Studio编程的开发人员所追捧。随着脚本语言的不断发展,研究人员对ASP并没有引入太多功能使之加入到技术竞争的行列。因此,在PHP中可以看到的诸如图像操作等功能没有集成到ASP中。但开发人员仍然可以通过DLL文件的形式编写(或者安装)第三方COM对象来完成类似的工作。在服务器自身允许的情况下,通过这种方式可以编写代码来完成任何动作。当然,造成的缺陷是这将导致为了配置这些服务开发人员不得不与桌面系统进行交互——对于Web开发人员来说这项功能并不是必须的。

ASP的优势是在企业环境中微软服务器几乎无处不在。此外,MS SQL Server同样具有广泛的市场,并且能很好的支持ASP(这并不会让人感到惊奇)。尽管事实上通过ODBC可以兼容任何数据来源,但SQL Server以及文件DSN访问(file DSN access)可以在代码一级得到实现。

ASP.NET
是选择ASP还是PHP的争论正在随着.NET的崛起而越来越显得多余。的确,过去长达数年的争论将随着是选择Java还是.NET技术(或是两者)答案的揭晓而终结。ASP以及ASP.NET的唯一联系是二者都使用VBScript。而单独就.NET而言,它可以使用VBScript以及其他大约20种语言。

对于ASP以及PHP来说,将ASP.NET看作是另外一种语言的原因是它运行在完全不同的构架之上。前者是翻译脚本语言,而.NET则是经过编译的framework。这就意味着首先Web页面的运行速度将会有极大提高。同时,源代码更加安全且更为健壮。此外,ASP.NET给Web编程带来了新的理念——即“code-behind页面”的思想。按照code-behind思想,每一个HTML页面都是由自身经过编译的程序化指令进行驱动。因此,HTML——或称之为表现层——很大程度上脱离了应用程序的商业逻辑。尽管这样的分离也可以通过PHP和ASP来实现,但这并非同ASP.NET一样属于自身技术的主要部分。

ASP.NET的另一好处是它完整的集成了对XML以及Web服务的各种支持。对.NET而言可以使用非常广泛的安全以及密码系统库,这对于金融机构和企业数据应用程序尤为有用。就缺陷而言,即使是具备丰富经验的开发人员也会发现使用.NET可能把自己搞糊涂。不考虑开发者对于所使用的编程语言的熟悉程度,对于Web开发人员来说,在程序范例方面难度的大幅提升可能会成为他们融入ASP.NET的主要障碍。对ASP.NET应用程序来说主机同样是个问题,ASP.NET并未同ASP或者PHP一样获得了主机提供商的广泛支持,无法在同一级别上展开竞争。

实践——语言比较
变量声明

 
在VBScript中(ASP和ASP.NET都使用VBScript),在使用变量之前并不一定要对其进行声明,尽管技术文档通常建议这么做。使用Option Explicit声明,开发人员可以通过程序强制进行变量声明。在PHP中,变量可以被声明,尽管没有办法强制开发人员做到这点。的确,在使用之前变量都自动进行声明。PHP变量的优点在于变量可以被设置成为其他变量的引用(references),而在VBScript中变量只能通过值来定义。

<%

' VBScript Example

Option Explicit

myVar = 1

myOtherVar = myVar

myVar = 2

 

' myResult will be 3

myResult = myVar + myOtherVar

%>

 

<?

// PHP Example

$myVar = 1;

'Use the ampersand to make a reference

$myOtherVar = &$myVar;

$myVar = 2;

// $myResult will be 4

$myResult = $myVar + $myOtherVar;

?>

变量收集
在PHP以及ASP中使用表单以及query string变量的方法非常相似。有很多办法可以访问表单以及query string变量的集合,例如通过name或者将其作为数组。在ASP.NET中情况则有很多不同,尤其是对于表单域。不同于盲目的寻找提交过的表单变量,code-behind可以对HTML页面中的每一个表单域了如指掌,并可以按照任何已知事件的执行为条件触发对这些表单域的值进行检查。其中一个事件是“postback”,当表单被用户提交时此事件被触发。其他的事件可以是客户端的程序,并且可以通过JavaScript来触发。在ASP.NET中,二者没有性质上的区别。

 
<%

' ASP Example

myFormVal = request.form("myInputField")

myQSval = request.querystring("myQSitem")

myVal = request.item("myFormOrQSitem")

%>

 

<?

// PHP 4.1+ Example

$myFormVal = $_POST['myInputField'];

$myQSval = $_REQUEST['myQSitem'];

 

// PHP 3+ Example

$myFormVal = $HTTP_POST_VARS['myInputField'];

 

// If register_globals = on

$myVal = $myFormOrQSitem;

?>

 

<!-- ASP.NET example -->

<html>

<script language="VB" runat=server>

Sub SubmitBtn_Click(Sender As Object, E As EventArgs)

Message.Text = "Hello " & Name.Text

End Sub

</script>

<body>

<form action="action.aspx" method="post" runat="server">

Name: <asp:textbox id="Name" runat="server"/>

<asp:button text="OK" OnClick="SubmitBtn_Click"

runat="server"/>

<asp:label id="Message" runat="server"/>

</form>

</body>

</html>

字符串连接(String Concatenation)
 PHP似乎对此问题给予了足够的重视,它允许将变量插入到字符串中而无需考虑通常的串连(Concatenation)问题。ASP.NET则把整个过程弄得比较麻烦,需要借助其StringBuilder类,但由此ASP.NET的运行速度也会快很多。

 
<?

// PHP Example

$link = mysql_connect("host", "user", "password")or die("mysql_error());

mysql_select_db("database") or die("Could not select database");

$query = "SELECT * FROM Table";

$result = mysql_query($query) or die(mysql_error());

 

while ($line = mysql_fetch_array($result, MYSQL_ASSOC)) {

foreach ($line as $col_value) {

//do something

}

}

?>

连接数据库
对于数据库的连接问题,每种技术都表现出了各自突出的规范性。首先,每种情况都要建立到数据库的连接。对于PHP,在建立之后选择数据库(对于ASP以及ASP.NET则将在连接阶段完成)。随后将建立一个询问,并将其传送给数据库,由此可能产生也可能不会产生一条返回记录。

 
由于在本质上ASP.NET更为以对象为导向,并且支持复杂的错误处理(error handling),因此无论是相对于PHP还是ASP,在完成简单任务方面ASP.NET可能会需要编写更多的代码。但在优势方面,ASP.NET完成显示数据功能所需要的代码则大大少于PHP以及ASP——尤其如果使用内建的datagrid控制来自动创建HTML输出。

<%

'ASP Example

Set objConn = Server.CreateObject("ADODB.Connection")

objConn.Open "Driver={SQL Server};Server=MyServerName;" & _

"Database=myDatabaseName;Uid=;Pwd="

 

const strSQL = "SELECT * FROM Table" Set objRS = Server.CreateObject("ADODB.Recordset")

objRS.OpenstrSQL, objConn

Do While Not objRS.EOF

'do something

objRS.MoveNext

Loop

%>

 

' ASP.NET Example

<%@ Import Namespace="System.Data" %>

<%@ Import Namespace="System.Data.SqlClient" %>

 

<html>

<script language="VB" runat="server">

Sub Page_Load(Sender As Object, E As EventArgs)

Dim MyConn As SqlConnection = New SqlConnection("server=(local). . . ")

Dim MyComm As SqlCommand = New SqlCommand("select * from Table", MyConn)

MyConn.Open()

Dim dr As SqlDataReader = MyComm.ExecuteReader()

MyDataGrid.DataSource = dr

MyDataGrid.DataBind()

MyConn.Close()

End Sub

</script>

<body>

<ASP:DataGrid id="MyDataGrid" runat="server"

Width="600"

BackColor="#FFFFFF"

BorderColor="#000000"

ShowFooter="false"

CellPadding=2

CellSpacing="0"

Font-Name="Verdana"

Font-Size="8pt"

HeaderStyle-BackColor="#EEEEEE"

EnableViewState="false"

/>

</body>

</html>

结论

选择ASP、PHP还是ASP.NET将最终取决于应用程序的需要,以及运行程序的系统环境。开发人员对于相似编程语言或范例的熟悉程度同样可以作为选择的因素。记住没有完美的方法和个人实际情况可以表明哪种技术是最佳选择。比如,使用ASP.NET为一个Windows服务器创建一个单页面的表单邮件应用程序似乎有些大材小用,但对于ASP来说这是极佳的应用环境。如果一个站点需要同Linux Apache服务器上的mySQL数据库连接,那么使用ASP或者ASP.NET则会显得力不从心。如果能够提前详细考虑用户的个人要求,那么开发人员在这些相互竞争的技术中进行选择的过程则已成功了一半。

PHP 相关文章推荐
用 PHP5 轻松解析 XML
Dec 04 PHP
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
中英文字符串翻转函数
Dec 09 PHP
从手册去理解分析PHP session机制
Jul 17 PHP
PHP中array_merge和array相加的区别分析
Jun 17 PHP
PHP实现事件机制的方法
Jul 10 PHP
PHP实现简单实用的验证码类
Jul 29 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
Jul 14 PHP
PHP5.6.8连接SQL Server 2008 R2数据库常用技巧分析总结
May 06 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 PHP
PHP获取当前时间不准确问题解决方案
Aug 14 PHP
WINDOWS服务器安装多套PHP的另类解决方案
Oct 09 #PHP
在同一窗体中使用PHP来处理多个提交任务
Oct 09 #PHP
使用MaxMind 根据IP地址对访问者定位
Oct 09 #PHP
Zend公司全球首推PHP认证
Oct 09 #PHP
真正面向对象编程:PHP5.01发布
Oct 09 #PHP
PHP中实现图片的锐化
Oct 09 #PHP
在Zeus Web Server中安装PHP语言支持
Oct 09 #PHP
You might like
一段php加密解密的代码
2006/10/09 PHP
PHP输出数组中重名的元素的几种处理方法
2012/09/05 PHP
php实现中文字符截取防乱码方法汇总
2015/04/29 PHP
php删除txt文件指定行及按行读取txt文档数据的方法
2017/01/30 PHP
PHP实现的CURL非阻塞调用类
2018/07/26 PHP
可以把编码转换成 gb2312编码lib.UTF8toGB2312.js
2007/08/21 Javascript
“不能执行已释放的Script代码”错误的原因及解决办法
2007/09/09 Javascript
Jquery实现视频播放页面的关灯开灯效果
2013/05/27 Javascript
返回上一页并自动刷新的JavaScript代码
2014/02/19 Javascript
JQuery弹出层示例可自定义
2014/05/19 Javascript
JavaScript实现俄罗斯方块游戏过程分析及源码分享
2015/03/23 Javascript
Javascript 是你的高阶函数(高级应用)
2015/06/15 Javascript
浅析jQuery 3.0中的Data
2016/06/14 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
JS实现的找零张数最小问题示例
2017/11/28 Javascript
使用axios实现上传图片进度条功能
2017/12/21 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
JS代码优化的8点建议
2020/02/04 Javascript
antd配置config-overrides.js文件的操作
2020/10/31 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[01:04:32]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第二场 2月23日
2021/03/11 DOTA
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
简单谈谈Python中函数的可变参数
2016/09/02 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
python的socket编程入门
2018/01/29 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
Python代码需要缩进吗
2020/07/01 Python
Python用摘要算法生成token及检验token的示例代码
2020/12/01 Python
缅甸网上购物:Shop.com.mm
2017/12/05 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
请解释接口的显式实现有什么意义
2012/05/26 面试题
大学生村官演讲稿
2014/04/25 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python