第1章 PHP快速入门
1.1 初识PHP
图1-1、图1-2、图1-3是一个正在建设中的B2B电子商务网站图示。该网站会员可以发表各种供求信息、商务合作信息、疑难采购信息、上传各种资质证书等多种商务功能,并能订阅、收藏、搜索其他会员发表的相关供求信息,并根据会员不同等级来实现一些信息的查看权限、功能使用权限等,是一个功能强大的电子商务网站。这个网站是如何设计出来的呢?开发者经过综合各种开发工具对比,最后选用了PHP作为开发工具。那么什么是PHP,PHP比其他开发工具又有哪些优势呢?
图1-1 一个设计中的B2B网站
图1-2 该B2B网站的目录页
图1-3 该B2B网站的会员功能页
PHP,是英文超级文本预处理语言(Hypertext Preprocessor)的缩写。它是一种嵌入在HTML代码中,并由服务器解释运行的脚本语言,服务器可以将PHP脚本程序代码解释成标准的HTML代码,在客户端的浏览器中显示。它可以用于管理动态内容、支持数据库、处理会话跟踪,甚至构建整个电子商务站点。它支持许多流行的数据库,包括MySQL、PostgreSQL、Oracle、Sybase、Informix和Microsoft SQL Server等。
总体来说,PHP非常适合Web上的工作,但它并不是唯一的开发工具;如Perl、Java、JavaScript、ASP、Python、CGI以及其他许多开发工具都可以生成动态的内容。PHP的优点是专为基于Web的问题而设计及开放源码,内嵌了许多使用方便的强大功能。随着对PHP的了解越来越深入,就越会体会到它的方便和强大。
作为开放源码的语言,PHP是随着越来越多的人意识到它的实用性从而逐渐发展起来的。Rasmus Lerdorf在1994年发布了PHP的第一个版本,从那时起,它就飞速发展,并在原始发行版上经过无数的改进和完善,现在已经发展到版本5。PHP版本6也已经在开发中。
PHP是一种嵌入式HTML脚本语言,它的大多数语法来源于C,也有一部分PHP特性借鉴于Java和Perl,因此PHP独特的语法混合了C、Java、Perl以及PHP自创新的语法,这可以让Web开发人员能够快速高效地写出动态生成的页面,它比CGI或者Perl更快速的执行动态网页。
与同样是嵌入HTML文档的脚本语言JavaScript相比,PHP在服务器端执行,充分利用了服务器的性能;PHP执行引擎还会将用户经常访问的PHP程序驻留在内存中,其他用户再一次访问这个程序时就不需要重新编译程序了,只要直接执行内存中的代码就可以了,这也是PHP高效率的体现之一。PHP具有非常强大的功能,所有的CGI或者JavaScript的功能PHP都能实现。
以上是一个简单的回答,不过对于初学者来说可能不是非常清楚它的意思,请看如下例子。
下面用Hello,World!例程来做一个介绍性的示范。
<html> <head> <title>Example</title> </head> <body> <?php echo "Hello,World!"; ?> </body> </html>
这个例程会在浏览器上输出:Hello,World! 这样一行文本。
1.1.1 PHP的起源
PHP并没有经历多长时间的发展,但是到现在它却成了一种非常先进、流行的技术,下面是PHP的简要发展历程。
1994年,Rasmus Lerdorf首次设计出了PHP程序设计语言。PHP继承自一个老的工程,名叫PHP/FI。PHP/FI是一个专为个人主页/表单提供解释程序的程序,已经包含了今天PHP的一些基本功能。它有着Perl样式的变量,自动解释表单变量,并可以嵌入HTML。语法本身与Perl很相似,但是它很有限,很简单,还稍微有些不协调,最初只是一套简单的Perl版本,用来统计他自己网站的访问者。Rasmus Lerdorf给这一套脚本取名为Personal Home Page Tools,简称即为PHP。后来又用C语言重新编写,包括可以访问数据库,可以让用户开发简单的动态Web程序。Rasmus Lerdorf发布了PHP/FI的源代码,以便每个人都可以使用它,同时大家也可以修正它的Bug并且改进这些源代码。
1995年6月,Rasmus Lerdorf在Usenet新闻组上发布了PHP 1.0声明,对外发表PHP的第一个版本。
1996年4月,Rasmus Lerdorf在Usenet新闻组上发布了PHP第二版声明。相比PHP 1单纯的标签置换代码,PHP第二版含有了可以处理更复杂的嵌入式标签语言的解析程序。到了1996年底,有15000个网站使用PHP/FI。但是那时只有几个人在为该工程撰写少量代码,它仍然只是一个人的工程。
1997年,Tel Aviv公司的Zeev Suraski和Andi Gutmans自愿重新编写了底层的解析引擎,其他很多人也自愿加入了PHP的其他部分而工作,从此PHP成为了真正意义上的开源项目。
PHP/FI 2.0在经历了数个beta版本的发布后于1997年11月发布了官方正式版本。不久,随着PHP 3.0的第一个alpha版本的发布,PHP从此走向了成功。
PHP 3.0使用了新的名称,它从PHP/FI 2.0的名称中移去了暗含“本语言只限于个人使用”的部分,被命名为简单的缩写“PHP”,它的全称是——Hypertext Preprocessor,约9个月的公开测试后,官方于1998年6月正式发布PHP 3.0。发布以后,它的用户数量才真正开始了飞涨。
PHP 3.0是类似于当今PHP语法结构的第一个版本。Andi Gutmans和Zeev Suraski在为一所大学的项目中开发电子商务程序时发现PHP/FI 2.0功能明显不足,于是他们重写了代码,这就是PHP 3.0。经过Andi,Rasmus和Zeev一系列的努力,考虑到PHP/FI已存在的用户群,他们决定联合发布PHP 3.0作为PHP/FI 2.0的官方后继版本。
PHP 3.0的一个最强大的功能是它的可扩展性。除了给最终用户提供数据库、协议和API的基础结构,它的可扩展性还吸引了大量的开发人员加入并提交新的模块。后来证实,这是PHP 3.0取得巨大成功的关键。PHP 3.0中的其他关键功能包括面向对象的支持以及更强大、协调的语法结构。
PHP 3.0跟Apache服务器紧密结合的特性,加上它不断的更新及加入新的功能;而且支持几乎所有的主流与非主流数据库,以及它高速的执行效率,1998年末,PHP的安装人数就已上万,有大约10万个网站报告他们使用了PHP,到1999年中使用站点就跃升到了15万个。加上它的源代码完全公开,在Open Source意识抬头的今天,它更是这方面的中流砥柱。它提供了丰富的函数,使得在程序设计方面有着更好的支持,并不断地有新的函数库加入,以及其他方面不停更新的活力,使得PHP无论在UNIX、Linux或是Windows的平台上都可以有更多新的功能。在PHP 3.0的顶峰,Internet上约有10%的Web服务器上都在使用它。
PHP 3.0官方发布不久,Andi Gutmans和Zeev Suraski就开始重新编写PHP引擎代码。这次的设计目标是增强复杂程序运行时的性能和PHP自身代码的模块性。PHP 3.0的新功能和广泛的第三方数据库、API的支持使得这样程序的编写成为可能,但是PHP 3.0并没有高效处理复杂程序的能力。
新的引擎被称为“Zend Engine”(这是Zeev和Andi的缩写),在成功实现设计目标后,于1999年首次引入PHP。基于该引擎并结合了更多新功能的官方正式版本PHP 4.0于PHP 3.0发布两年后的2000年5月22日发布,除了更高的性能以外,PHP 4.0还包含了其他一些关键功能,比如:支持更多的Web服务器、HTTP Sessions支持、输出缓存(output buffering)、更安全的处理用户输入的方法和一些新的语言结构。该版本的开发是由希望对PHP的体系结构做一些基本改变的开发者推动的,这些改变包括将语言和Web服务器之间的层次抽象化,并且加入了线程安全机制,加入了更先进的两阶段解析与执行标签解析系统。
PHP 4.0是当前PHP的比较有影响的成熟版本,它是如此的成功,以至于现在仍有许多网站运行在PHP4平台上,大量可供下载的PHP网站源代码亦仍然是基于PHP 4.0编写的,尽管PHP4的发展是如此迅猛,但较之于其他流行的开发语言还是缺乏一些关键的功能特性,比如,PHP4中的面向对象功能并不完善,也无法实现异常(Exception)的捕捉与处理,因此在一些特殊问题的处理上还是捉襟见肘的。
2004年7月13日,使用了全新第二代Zend引擎的PHP 5.0发布,标志着一个全新的PHP时代的到来。这个版本引入了对全新的PECL模块的支持,最大特点是引入了面向对象的全部机制,并且保留了向下的兼容性,有的PHP4程序可以运行于PHP5的平台上而不会出现较大问题。程序员不必再编写缺乏功能性的类,并且能够以多种方法实现类的保护。另外,在对象的集成等方面也不再存在问题,PHP5引进了类型提示和异常处理机制,能更有效地处理和避免错误的发生。
随着数据库的发展,PHP5还绑定了新的MySQLi扩展模块,它提供了一些更加有效的方法和实用工具用于处理数据库操作,还提供了数据库引擎SQLite扩展,直接用这个扩展就可以创建和使用SQLite数据库。PHP5添加了面向对象的PDO模块,提供了另外一种数据库操作的方案,统一了数据库操作的API。PHP5这些方法大都以面向对象的方式实现,同时也极大地提高了基于数据库的Web项目的执行速度。
另外,PHP5中还改进了创建动态图片的功能,目前能够支持多种图片格式(如PNG、GIF、TTIF、JPGE等),内置了对GD2库的支持,因此安装GD2库(主要指UNIX系统中)也不再是件难事,这使得处理图像十分简单和高效。
大多数Web程序开发者依然将XML作为一个简单数据库使用,PHP5中也采用了一系列简单易用、功能强大的方法处理XML文档。
PHP5.2.0增加了JSON函数,更好的支持ajax。
今天,已经有包括Yahoo.com和Amazon.com等在内的数百万网站,以及众多的开发人员和编程爱好者正在使用PHP。从最初的PHP/FI到现在的PHP5,PHP的发展是及其迅猛的,其未来的发展前景也必定令人瞩目。
TIOBE世界编程语言排行榜展现了编程语言的流行趋势,每个月都有最新的数据被更新,这份排行榜的数据取样来源于互联网上富有经验的程序员、商业应用、著名的搜索引擎(诸如谷歌、MSN、雅虎)的关键字排名、Alexa上的排名等,其官方网站为www.tiobe.com/index.php/content/paperinfo/tpci/index.html,从其排名中可以发现,PHP已经长时间稳居该排行榜第3名。表1-1是其最新发布的2010年1月份前20名排名情况。
表1-1 TIOBE世界编程语言排行榜(2010年1月份)
1.1.2 PHP的特性
PHP的特性包括。
开放源代码:所有的PHP源代码都可以免费得到。
经济:PHP是免费的。
便捷性:PHP十分便捷,学习简单,易上手。
服务器端支持:跨平台,性能优越,可以运行在UNIX、Linux、Windows等各种操作系统下。
嵌入HTML:因为PHP可以嵌入HTML语言,所以学习起来并不困难。
语法简单:PHP坚持脚本语言为主,与Java和C++不同,如果有C语言的经验,很容易上手。
效率高:PHP消耗相当少的系统资源。
图像处理:用PHP可以方便的动态创建多种格式的图像。
面向对像:在PHP4、PHP5中,面向对象方面都有了很大的改进,现在PHP完全可以用来开发大型商业程序。
1.1.3 PHP与ASP、JSP的比较
目前的Web应用开发上,ASP、PHP和JSP是三种最流行的脚本语言,那么他们之间有什么区别,怎么选择一个合适的脚本语言工具呢?下面我们将三者之间做一个比较。
1. ASP
ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和Visual BASIC类似,可以像SSI(Server Side Include)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,如上传文件功能的实现比较复杂等,最重要的则是其安全性问题,曾经多次爆出安全漏洞。目前在微软的.net战略中新推出的ASP.net借鉴了Java技术的优点,使用C# (C Sharp)语言作为ASP.net的推荐语言,同时改进了以前ASP的安全性差等缺点。但是,使用ASP/ASP.net仍有一定的局限性,因为从某种角度来说它们只能在微软的Windows NT/2000/XP + IIS的服务器平台上良好运行(虽然像ChilliSoft提供了在UNIX/Linux上运行ASP的解决方案,但是目前ASP在UNIX/Linux上的应用仍几乎为零),所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
ASP简单易上手,通常使用ODBC连接数据库,只能运行在微软的IIS环境中。
2. PHP
PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样),而PHP独特的语法混合了C、Java、Perl以及PHP式的新语法,它可以比CGI或者Perl更快速地执行动态网页。
PHP的源代码完全公开,在Open Source意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程序设计方面有着更好的资源,它可以在Windows以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点。在PHP的早期版本中如果不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一,这样,使得程序在不同数据库环境中的移植变得有些麻烦。然而从它的版本5开始引入了PDO类,提供了使用相同方法来连接、调用各种数据库的功能。作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。
3. JSP
JSP和Servlet要放在一起介绍,是因为它们都是Sun公司的J2EE(Java 2 platform Enterprise Edition)应用体系中的一部分。
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process),而Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(Parent Thread)来实现资源共享,这样就减轻了服务器的负担,所以,Java Servlet可以用来做大规模的应用服务。
虽然在形式上JSP和ASP或PHP看上去很相似——都可以被内嵌在HTML代码中。但是,它的执行方式和ASP或PHP完全不同。在JSP被执行的时候,JSP文件被JSP解释器(JSP Parser)转换成Servlet代码,然后Servlet代码被Java编译器编译成.class字节文件,这样就由生成的Servlet来对客户端应答。所以,JSP可以看做是Servlet的脚本语言(Script Language)版。
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA - Write Once, Run Anywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。因此,JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数,而是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错),逐步缩小出错代码段的范围,最终确定错误代码的位置。
4. ASP、PHP和JSP比较
下面表1-2将对三者之间做一个比较。
表1-2 ASP、PHP和JSP比较