简 介
2000年我在编写本书第一版时,PHP还只是一个几乎不为人知的开源项目。它被熟知内幕的技术人员所钟爱,但是还没有像今天这样成为Web开发方面公认流行的选择。当我自学PHP的时候,关于这种语言的文档少之又少,这正是我编写此书的初衷。
现在形势不一样了。因特网经历大起大落,进入了稳定的发展期。而且,PHP现在已经成为程序员首选的动态Web设计工具,并且开始将领域扩张至Web开发之外。但是,尽管PHP已经广为流行,相关的文档、示例代码和样例也越来越丰富,出版一本介绍PHP的好书还是很有必要的。PHP已经发布了6个主要版本,对于学习PHP的读者来说,本书这样简洁实用的教程正是所需的最佳指南。
本书不仅帮助读者深入理解基本原理,同时还将引导读者如何获取进阶信息。尽管本书不是编程参考大全,但是通过详尽阐述和真实样例,它为读者提供了使用PHP构建动态Web站点和Web应用程序的必备知识。
PHP是什么
PHP是Personal Home Page的缩写,代表的意思是个人主页。它最早是由Rasmus Lerdorf在1994年创建的,用来跟踪他在线简历的访问者。随着PHP的实用性和功能的增强(同时它被应用在越来越专业的场景中),它代表的意思变化成为PHP:Hypertext Preprocessor(超文本预处理程序)。[这个定义的主要意思是PHP在数据变为HTML(Hypertext Markup Language)之前先处理数据。]
通过PHP的官方网站www.php.net(参见图i-1)可以了解到,PHP是一种HTML内嵌式脚本语言。下面详细解释这个定义的含义。
PHP定义中“HTML内嵌式”的意思是它可以混杂在HTML代码中。HTML是一种用来生成所有Web页面的代码。因此,使用PHP编写代码只比使用HTML稍微复杂一点点。
此外,相对于编程语言来说,PHP是一种脚本语言。这意味着PHP被设计成为仅当事件发生之后才会开始工作。例如在用户提交表单后,或者前往某个URL(Uniform Resource Locator,统一资源定位符,即Web地址)时,PHP才会开始工作。相反,像Java和C这样的编程语言可以用来编写独立的应用程序,但是不一定会同Web有联系。脚本语言中最常见的例子就是JavaScript,它被普遍应用于处理Web浏览器中发生的事件。用来区别这两种语言的另外一种方法是:对于诸如PHP和JavaScript这样的语言使用术语“解释”,因为它们都不能自行发生作用,而Java和C可以在编译后直接运行。
图i-1 该图为编写本书时PHP官方网站的截图。这是寻找关于PHP问题的答案和满足对它好奇心的首选地址
除了是脚本语言,PHP还是一种服务器端技术。这是指PHP所做的一切均在服务器端(而不是在客户端——用户浏览网站的计算机中)发生。服务器是一台计算机,用来提供用户使用浏览器(例如,Firefox、IE或者Safari)访问某个Web地址时的页面。后文将介绍这个过程的细节(参看“PHP是如何工作的”)。
最后,PHP是一种跨平台的技术,这意味着它能够用在运行Unix、Windows、Macintosh和其他操作系统的机器上。当然我们讨论的是服务器运行的操作系统,而不是客户端运行的操作系统。PHP不仅能够运行在几乎所有的操作系统上,而且与其他大多数的编程语言不同,它能够在不同的操作平台上进行切换,而不做或者仅仅做很少的修改。
在撰写本书时,PHP的版本为4.4.9和5.2.6(5.x尚未广泛使用,因此出于所有重要的安全考虑还继续保留老版本)。本书是使用PHP 6开发版进行的测试,这是这门语言的下一个主要版本(在编写此书时尚不能确定该版本的发布时间)。PHP 6中的主要改变是开始支持Unicode,这是一个重大的改变!简而言之,Unicode提供对于每一种语言呈现每个字符的方法。因此,PHP 6可以用来处理任何语言的字符串,甚至变量和函数名都可以使用任何语言进行书写。
PHP的局限性
学习PHP的新手们经常感到迷惑不解的问题是:PHP不能用来做什么。虽然可以用这门语言来完成纷繁的任务,但是它最主要的限制就是不能在Web站点中实现客户端的功能。
使用诸如JavaScript这样的客户端技术,可以创建一个新的浏览器窗口、添加鼠标悬停响应、弹出警告窗口、重设浏览器窗口的大小、获取用户机器的屏幕尺寸,并且动态地生成和修改表单。这些用PHP都无法做到(因为PHP是服务器端脚本语言,而上述问题都需要在客户端实现)。但是,可以用PHP生成JavaScript,就像可以用PHP生成HTML那样。
在开发自己的PHP项目时,请记住只能使用PHP向Web浏览器发送信息(HTML等)。在向服务器发送另一个请求之前(比如提交表单或者单击某个链接之前),不能在Web浏览器中做任何事情。
在PHP 6中,另外一个重大改变就是移除了一些过时的特性。在PHP 6发布之前的一段时期内这些被移除的特性在PHP默认设置中都是被禁用的,虽然可以重新启用,但是一般都建议不要再使用它们。在PHP 6中,将没有这样的选择。
尽管本书的代码环境使用PHP 6开发版,但是所有的代码都能够向后兼容。如果不能兼容4.x版,至少能够支持PHP的5.x版。在少数情况下,可能仍然会使用将在PHP 6中移除的特性,此时的注解或者提示中,将会说明如何对代码进行相应的调整。
请访问PHP.net和www.zend.com以获得更多信息,zend.com体现了PHP核心背后的思想(参见图i-2)。
.
图i-2 这是Zend的主页,聚集了编写PHP的核心开发人员。该网站包含了大量有用的软件、代码库和编写得很好的教程
为什么要使用PHP
简而言之,同其他同类语言相比,PHP能够表现得更好、更快,并且更简单易学。所有的Web站点都必须以HTML开始,因此可以使用许多静态HTML页面来创建一个完整的站点。但是基础的HTML在灵活性和提供响应方面都有局限。访问者进入HTML页面时看到的是简单的、没有定制或者动态行为的页面。使用PHP则可以进行同数据库和文件的交互、处理邮件等操作,做很多HTML不能做的事情。
很久以前,Web站点设计者就认识到不能单独用HTML创造出迷人的、持久的Web站点。为了结束这种状态,诸如PHP的服务器端技术应运而生。这些技术能够让Web页面设计者创建Web应用程序,这些Web应用程序能够被动态地生成,并且将程序员所渴望的元素都纳入考虑的范畴。这些高级站点通常都是数据库驱动的,能够比静态HTML页面更快地进行升级和维护。
当进行服务器端技术选择时,PHP最主要的对手是CGI(Common Gateway Interface,通用网关接口,一般来说并不一定用Perl编写)脚本、ASP.NET、Adobe的ColdFusion、JSP和Ruby on Rails。JavaScript并不是PHP的真正替代品(反之亦然),因为JavaScript是一种客户端技术,并且不能同PHP或其他这类技术一样用来创建HTML页面。
现在问题是,为什么Web设计者要用PHP而不用CGI、ASP.NET、JSP等技术来创建动态的Web站点呢?
PHP更易于学习和使用
在阅读本书之后,没有经过正式编程培训的人都能够轻松地编写PHP脚本。相比较而言,ASP.NET要求了解VBScript、C#或者其他语言;CGI要求有Perl(或者C)编程基础。它们都是更加复杂且难以学习的语言。
PHP专门用来编写动态Web页面
Perl(以及VBScript和Java)则不是,这个事实暗示了出于自身特定的意图,PHP能够在处理特定任务时比它的那些竞争者更加迅速并且更加简便。但是本书需要点明的是,虽然在处理某些任务时更加优秀(因为它就是为了解决这些问题而创造出来的),PHP并不是比Java或者Perl更好的编程语言——后两者能够做PHP不能做的许多事情。
PHP不仅免费而且跨平台
因此,可以在任何计算机上使用它而不产生费用。此外,PHP的开源本质上意味着是PHP的用户推动了它的发展,而不是由什么企业实体。
PHP是可以用来开发动态Web站点的最受欢迎的工具
在本书编写时,有超过两千万个站点是由PHP编写的(参见图i-3)。掌握这项技术,不仅能够让编写PHP成为你的爱好,而且这项技能还能够让你获利。
图i-3 Netcraft(www.netcraft.com)上的图片显示了从2000年后PHP使用量的显著增长
PHP是如何工作的
PHP是一种服务器端语言,这意味着用PHP编写的代码将在为Web浏览器提供Web页面的主机上运行。当访问一个Web站点(例如,www.DMCinsights.com)时,所涉及的Internet服务提供者(ISP)将把请求定向到保存着www.DMCinsights.com信息的服务器上。服务器读取PHP代码并执行脚本指令。在这个示例中,PHP代码告知服务器以HTML的形式向浏览器发送适当的Web页面(参见图i-4)。简而言之,PHP按照所选择的参数创建了一个HTML页面。
图i-4 这张图示范了在客户端和服务器端之间进行的处理工作(虽然是在极其简单的条件下),PHP模块(添加进服务器的一个应用程序,用来增加它的功能)用来向浏览器发回HTML。所有的服务器端技术都在服务器上使用一个第三方模块,用来处理发送回客户端的数据
HTML生成的网站有所不同,当请求发出时,服务器仅仅向Web浏览器发送HTML数据——没有服务器端解释发生(参见图i-5)。换句话说,在最终用户的浏览器上查看home.html和home.php并不一定有明显的区别,但是如何生成这两个页面却有重大不同。主要的不同之处在于,使用PHP可以让服务器动态地生成HTML代码。例如,今天是星期一而不是星期二,或者如果用户已经访问过该页,这样的不同信息能够被呈现出来。(动态Web页面的创建,将不那么吸引人的静态网站同更有趣因而访问量更大、更具有交互性的网站区分开来。)
图i-5 将图i-5中服务器处理HTML的方式与图i-4进行比较。这跟通过浏览器查看本地的HTML页面没有区别——本地页面不需要服务器处理,但是动态生成的页面需要通过服务器访问,因为动态页面要经过服务器处理
使用PHP和直接使用HTML之间重要的不同之处在于,PHP在服务器端处理完所有的事情之后向浏览器发送适当的信息。本书将介绍如何使用PHP向浏览器发送正确的数据。
准备工作
使用PHP最重要的条件是能够访问启用了PHP的服务器,这是因为它是一种服务器端脚本语言。考虑到PHP相当普及,因此ISP或者Web主机提供商极有可能已经在他们的服务器上安装了PHP模块。使用时需要同他们联系以确认支持哪些技术。
另外一个选择是在自己的计算机上安装PHP和Web服务器应用程序(如Apache)。Windows、Mac OS X或者Linux的用户都能够免费安装和使用PHP。附录A提供了安装PHP的指导。如果希望使用自己的服务器,并且自己安装PHP,那么可以在PHP的Web站点(www.php.net)上找到免费下载的安装包。如果采用后一种方式(这也是我们推荐的方式),那么你的计算机将可以同时作为客户端和服务器端使用。
第二个条件是:在计算机上必须拥有一个文本编辑器。Crimson Editor、WordPad、TextWrangler以及类似的免费应用程序都能够很好地满足需要,同时BBEdit、EditPad、TextMate和其他的商业应用程序可以提供用户喜欢的更丰富的特性。如果习惯于使用如Adobe Dreamweaver(参见图i-6)的图形化界面(也被称作WYSIWYG——所见即所得),可以考虑查阅这些应用程序的手册以了解如何利用它们进行编程。请访问http://www.dmcinsights.com/links/1以寻找支持PHP的优秀编辑器。
图i-6 广受欢迎的Dreamweaver IDE提供包括PHP在内的服务器端技术的开发环境
第三,是一种把在文本编辑器中编写的脚本放到服务器上的方法。如果在自己的计算机上安装了PHP,那么可以将它们保存在适当的目录中。但是,如果使用ISP或者Web主机提供商提供的远程服务器,那么需要一个FTP(File Transfer Protocol,文件传输协议)应用程序把脚本上传到服务器。在第1章中,本书将使用免费的FileZilla(www.filezilla-project.org,参见图i-7)作为示例。
图i-7 FileZilla应用程序可以运行在许多操作系统上,用于向远程服务器上传PHP脚本和其他的文件
最后,如果读者想试验第12章中的示例,那么需要访问MySQL(www.mysql.com,参见图i-8)或者其他数据库应用程序。MySQL也是免费的应用程序,可以安装在自己的计算机上。
图i-8 (在编写此书时)MySQL的Web站点
本书假定读者仅具备HTML的基础知识。当然,如果比较熟悉手工编写HTML代码,而不是使用诸如Dreamweaver这类创建Web网站的辅助应用程序,那么学习PHP将变得更加容易。每个程序员都将最终求助于HTML的参考资料,不论之前已经了解有多少,我都建议你将一本好的HTML参考书放在手边。这类HTML编程入门书籍有Elizabeth Castro编著的《HTML XHTML CSS基础教程(第6版)》(人民邮电出版社2007年出版)。
本书并不要求你已经具备编程的经验。但是,如果你有编程的经验将能够加速学习的进度,因为在学习的过程中你会很快发现有很多地方都同以往的经验相通。例如,Perl和PHP或者JavaScript和PHP都有类似之处。
本书有什么新内容
本书对上一版进行了小幅修订。当第2版编著完成时,PHP已经发展到4.x版,第5版正在开发中。现在第5版已经发布而第6版正在开发中。PHP 5中最重要的变化影响到一些主题(比在这里讨论的内容更加高级)。PHP 6中最重要的变化是对Unicode的支持以及对一些特性的移除。
考虑到这一点,本书的第一个改变是删除了一些主题,因为有些内容在PHP 6中将不再适用。第二个改变是,本书使用Unicode和UTF-8编码(如果不知道这意味着什么,请参看第1章)更新了所有的示例。第三,修改了一些示例代码,以做到尽善尽美。
关于本书
本书旨在向读者介绍PHP编程的基础知识,同时也对他们将来可能用到的更多高级特性给出提示,而没有过分探究细节。本书中的内容将延续下面的惯例。
逐步介绍指明了需要你手工编写的代码,以及该代码在脚本中的位置。这些需要输入的代码以下面字体给出。例如:
(?php print "Hello, World! "; ?)
PHP代码还会以完整的脚本给出,并且带有行号作为参考(参看脚本i-1)。读者在编写代码时不能插入这些数字,因为这样将导致代码不能执行。本书建议使用能自动显示行号的文本编辑器——在进行调试工作的时候,这些数字可以提供帮助。有时候,你会发现脚本中某些特殊的行被加粗了,这是为了引起你对新的或者其他相关信息的注意。
脚本i-1 PHP示例脚本,标记有行号,并且对特殊代码段用粗体强调
1(!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd")
3(html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en")
4(head)
5(meta http-equiv="Content-Type" content="text/html; charset=utf-8"/)
6(title)Hello, World!(/title)
7(/head)
8(body)
9(?php print "Hello, World!"; ?)
10(/body)
11(/html)
根据PHP的工作原理,应该知道对每段脚本都可以从3个角度来观察:PHP代码(如脚本i-1)、发送给浏览器的代码(主要是HTML)以及浏览器向最终用户呈现什么。在适当情况下,本书将通过部分或完整的浏览器窗口的屏幕截图,呈现脚本示例运行的最终结果(参见图i-9)。有时候也会给出浏览器显示接收到的HTML源代码的截图(参见图i-10)。通常可以在适当的Web浏览器菜单中,通过选择View Source或者View Page Source来查看源代码。总之,图i-10显示了浏览器接收到的HTML,而图i-9演示了浏览器解释相应HTML的结果。使用PHP,可以创建发送到浏览器的HTML。
图i-9 这是一个示例视图,可以看到浏览器窗口。对于本书中的示例,无论你使用什么浏览器或操作系统,结果都不会有什么不同
图i-10 通过查看Web浏览器获取的源代码,可以看到由服务器发送的PHP创建的HTML
由于版面有限,因此逐步介绍中的某些PHP代码行在印刷时会出现折行,这种情况也许在读者的编辑器中不会出现。在出现这样的情况时,本书会用一个小灰色箭头表示折行。例如:
print "This is going to be a longer line→of code.";
对此,读者在脚本中的代码应该还是写在一行中,否则在执行时将会遇到错误(编有行号的脚本中不使用灰色箭头)。
当示范新特性和新技术时,本书将尽力解释清楚“为什么这样”以及“如何做到”。通过阅读理解和使用函数,应该可以确切地掌握它。当然,有一些疑问是不可避免的,本书为此提供了一些参考资源以便查找到问题的答案(参看附录B)。如果对于某些特定的函数或者示例有疑问,最好查看在线的PHP手册,或者参考本书提供的Web站点(以及其中的用户支持论坛)。
哪本书更适合
这是我为PHP写的第一本书的第3版。同第1版一样,本书的编写考虑到了初学者和没有编程基础的读者。如果只有很少甚至没有编程经验,或者偏爱舒缓的学习进度、喜欢学习的时候慢慢咀嚼,那么这本书最适合不过了。请别误会:本书其实涵盖了开发动态Web网站必备的所有知识(还使用了真实的示例),但是它并不包含深奥的理论或者高级应用。
相反,如果能够迅速接受新技术,或者已经有了一定程度的Web站点开发经验,你可能会觉得本书太基础了。在这种情况下,可以考虑阅读我的《PHP 6与MySQL5基础教程》 。该书详细讨论了SQL和MySQL,并且提供了不少更加复杂的示例,而且其学习步调非常轻快。
关联网站
本书关联的Web站点非常有用,其网址是:www.DMCinsights.com/phpvqs3(参见图i-11)。在这里,可以下载书中涉及的每段代码。 (但是,本书强烈建议读者自己输入这些代码,这样对熟悉PHP的结构和语法都非常有帮助。)
图i-11 本书的Web网站
这个网站还包括一个更加详细的参考部分,这个部分提供了大量Web页面的链接,通过这些页面可以进一步学习PHP。此外,站点的勘误部分还列出了本书中存在的错误。
可能会给读者带来最多帮助的是本书的支持论坛,论坛的地址是:www.DMCInsights.com/ phorum/list.php?23(参见图i-12)。通过使用这个论坛将能够:
找到问题的答案;
得到如何实现你的想法的建议;
获得来自其他读者的调试帮助;
了解这项技术的变化给本书中的示例带来怎样的影响;
学习其他人如何使用PHP;
获得比直接给我发送邮件更快的回复。
图i-12 如果你需要更多的帮助,请访问本书支持的论坛,这里是我和读者用来发布问题和解决方案的地方
问题、意见和建议
如果有与PHP相关的问题,可以通过新闻组、邮件列表,以及PHP有关的Web网站中的问答区来解决。附录B更详细地讨论了这方面的内容。浏览这些参考资料或者在Internet上进行搜索通常是最快获得问题解答的方式。
也可以将问题、意见和建议直接发送给我。使用本书的关联论坛,将获得最快的答复(我通常会首先在这里回答问题)。如果更希望用邮件的方式,我的联系信息在Web网站上也可以找到。我将尽力回复收到的每封邮件,但也许要等上几周(反之,如果希望通过论坛获取回复的话,可能只要等几天就可以了)。
如果希望获得更多的提示和启蒙式的阅读,请在www.catb.org/~esr/faqs/smart-questions. html上参看Eric Steven Raymond所写的文章的“How to Ask Questions the Smart Way”。花10分钟来阅读该文章,能够帮助读者在将来节省数小时的时间获得答案。包括我在内的其他将回答问题的人们会不胜感激!
提问的智慧
不论是向本书的支持论坛发布消息、给我发送邮件,还是在新闻组里问问题,知道如何最有效地提问将大大提升得到回复的质量,以及获得答案的速度。为了在最短时间内获得到最佳回答,请遵照以下的步骤:
(1) 在Internet上搜索,阅读相关手册,浏览所有可能有用的文档;
(2) 在最合适的论坛(新闻组、邮件列表等)上提问;
(3) 使用清晰简明的标题;
(4) 详细描述你的问题,提供相关的代码,告知什么地方出错,以及使用的PHP版本和操作系统。