PHP(PHP:Hypertext Preprocessor 超文本预处理器的递归缩写)是一种被广泛应用的开源的多用途脚本语言,它可以嵌入到 HTML 中,尤其适合 web 开发。
为了便于理解,我们举例说明:
<!DOCTYPE HTML>
<html>
<head>
<title>Example</title>
</head>
<body>
<?php
echo "Hi, I'm a PHP script!";
?>
</body>
</html>
和其他用大量的命令来编写程序以输出 HTML 代码的脚本(像 C 或者 Perl)不同的是,PHP 页面就是 HTML 页面,只不过在其中嵌入了一些代码来做一些事情(如在本例中输出了「Hi, I'm a PHP script!」)。PHP 代码被包含在特殊的起始符 <?php
和结束符 ?>
中,使得其可以自由切换「PHP 模式」,输出 HTML 代码或者运行 PHP 代码。
和客户端的 JavaScript 不同的是,PHP 代码是运行在服务端上的,生成 HTML 代码,然后将其发送到客户端。客户端能够得到脚本运行后的结果,却无法得知其背后的代码具体是怎样的。你甚至还可以将 web 服务器设置成让 PHP 来处理所有的 HTML 文件,这么一来,用户就无法得知服务端到底做了什么。
使用 PHP 来开发的一大好处是,它对于初学者来说极其简单,同时也给专业的程序员提供了各种高级的特性。当看到 PHP 长长的特性列表时,完全不用害怕。只要一点点时间,你就能很快上手并写一些简单的脚本。
尽管 PHP 主要是用来写服务端脚本,但事实上其功能远不局限于此,接下来我们聊聊它可以做什么。
PHP 能做任何事。PHP 主要用于服务端的脚本程序,所以可以用 PHP 来完成其他 CGI 程序能做的所有工作。例如收集表单数据,生成动态网页,或者发送和接收 Cookies。但 PHP 能做的远不于此。
PHP 脚本主要用于以下三个领域:
服务端脚本。这是 PHP 最传统,也是最主要的目标领域。开展这项工作需要具备以下三点:PHP 解析器(CGI 或者服务器模块)、web 服务器和 web 浏览器。在运行服务器的时候,需要安装并配置好 PHP。然后,可以通过 web 浏览器来访问 PHP 程序的输出,即浏览服务端的 PHP 页面。如果只是实验 PHP 编程,所有的这些都可以运行在自己家里的电脑上。
命令行脚本。可以用来编写一段 PHP 脚本,并且不需要任何服务器或者浏览器来运行它。这种方式下,仅仅只需要 PHP 解析器来执行就可以了。这对于依赖 cron(Unix 或 Linux 环境)或者 Task Scheduler(Windows 环境)等按计划运行的定时任务来说是理想的选择。这些脚本也可以用来处理简单的文本任务。
编写桌面应用程序。对于带有图形界面的桌面应用来说,PHP 或许不是一种最好的选择,但是如果用户非常精通 PHP,并且希望在客户端应用程序中使用 PHP 的一些高级特性,那么可以使用 PHP-GTK 来编写这些程序。用这种方法,还可以编写跨平台的应用。PHP-GTK 是 PHP 的一个扩展,在通常发布的 PHP 包中并没有包含,有兴趣的可以访问其网站。
PHP 能够在所有主流的操作系统上使用,包括 Linux,Unix 的各种变种(包括 HP-UX、Solaris 和 OpenBSD),Microsoft Windows,macOS,RICS OS 等。今天,PHP 已经支持了大多数的 web 服务器,包括 Apache,IIS 等等,还有许多。其中也包括了所有能利用 FastCGI PHP 二进制文件的 web 服务器,像 lighttpd 和 nginx。PHP 支持以模块或者 CGI 处理器的方式来工作。
综上所述,使用 PHP,可以自由地选择操作系统和 web 服务器。同时,还可以选择使用面向过程编程或者面向对象编程(OOP),或者两者结合的方式来进行开发。
使用 PHP 并不局限于输出 HTML。PHP 还可以被用来输出图像,PDF 文件,甚至 Flash 动画(使用 libswf 和 Ming)。还能够简便的输出文本,例如 XHTML 以及任何其他形式的 XML 文件。PHP 能自动生成这些文件,在服务端开辟出一块动态内容的缓存,可以直接把它们打印出来,或者保存到文件系统中。
PHP 最强大最显著的特性之一,就是支持广泛的数据库。使用任何针对某数据库的扩展(例如 mysql)编写数据库支持的网页非常简单,或者使用抽象层如 PDO,或者通过 ODBC 扩展连接到任何支持 ODBC 标准的数据库。其它一些数据库也可能会用到 cURL 或者 sockets,如 CouchDB。
PHP 还支持利用诸如 LDAP、IMAP、SNMP、NNTP、POP3、HTTP、COM(Windows 环境)等不计其数的协议的服务。还可以打开原始网络套接字,使用任何其他的协议进行交互。PHP 支持和所有的 web 开发语言之间的 WDDX 复杂数据交换。谈到互相,PHP 支持 JAVA 对象的实例化,并将其透明地用作 PHP 对象。
PHP 具有极其有效的文本处理特性,包括 Perl 兼容正则表达式(PCRE)以及许多扩展和工具可用于解析和访问 XML 文档。PHP 将所有的 XML 功能保准化与坚实的 libxml2 扩展,并且还增加了 SimpleXML、XMLReader 以及 XMLWriter 支持。
另外,还有很多有趣的扩展库,都可以在 PHP 官方手册中查看。还有一些附加的 PECL 扩展可能没有在 PHP 手册中列出,比如 XDebug。
正如今天大家所知道的,PHP 继承自一个叫 PHP/FI 的工程。在 1994 年,Rasmus Lerdorf 创建了 PHP 的第一个前身,用 C 语言编写的通用网关接口(CGI)的二进制文件。最初用于跟踪他的在线简历的访客,并将这套脚本程序命名为「Personal Home Page Tools」,后来更多的被称之为「PHP Tools」。随着时间的推移,更多的功能需要增加,Rasmus 改写了一个更强大更丰富的实现,它可以访问数据库,用户可以用它开发简单的动态 web 程序,例如留言板。在 1995 年 6 月,Rasmus 开放了 PHP Tools 的源代码,以便每个人都可以使用它,同时大家也可以修复其中的 bug,并帮忙改进源代码。
同年 9 月,Rasmus 扩展了 PHP,实际上在很短的一段时间内,已经不叫 PHP 了。现在叫 FI(Forms Interpreter 的简称),新的实现包含了今天 PHP 的一些基本功能。它有着 Perl 样式的变量,自动解释表单变量,并可以嵌入 HTML。语法本身和 Perl 很相似,但是它很有限,很简单,还稍微有些不协调。事实上,要将代码嵌入到 HTML 文件中,开发者必须使用 HTML 注释。虽然这种做法没有被完全的很好接受,但是 FI 仍然作为 CGI 工具持续发展——还不完全是一种语言。然而,接下来的一个月里,一切开始改变了。1995 年 10 月,Rasmus 发布了一份完全重写的代码,又重新命名为 PHP,此时叫做「Personal Home Page Construction Kit」,首次发布并扬言这是一套先进的脚本接口。该语言被故意设计成类似于 C 的结构,使得它很容易被熟悉 C、Perl 等类似语言的开发者所采用。当时,还只支持 Unix 和兼容 POSIX 的系统,对于 Windows NT 的支持还在开发中。
1996 年 4 月,对代码进行了完整的修改,结合过去的版本名称,Rasmus 推出了 PHP/FI。这一次真正地让 PHP 走上了从一套工具到称为一种编程语言的发展之路。内置支持 DBM、mSQL,以及 Postgres95 数据库,还有 Cookies,用户自定义函数等等。6 月,PHP/FI 版本号定为 2.0。然而,一个有趣的事是,PHP 2.0 只有一个唯一的版本号。在 1997 年 11 月结束测试的时候,底层的解析引擎已经被彻底重写了。
虽然发展时间很短,PHP 仍在年轻的 web 开发世界中越来越受到欢迎。在 1997 年和 1998 年,PHP/FI 在全世界有几千个发烧友。截止 1998 年 5 月,网络调查显示,有近 60000 个域名使用了包含「PHP」的信息头,表明主机服务器确实安装了 PHP。这个数字在当时相当于互联网上所有域名的 1%。尽管这些数字看起来还可以,但 PHP/FI 的发展注定是有限的;即使有一些贡献者,但它主要还是由个人开发。
PHP/FI 代码:
<!--include /text/header.html-->
<!--getenv HTTP_USER_AGENT-->
<!--ifsubstr $exec_result Mozilla-->
Hey, you are using Netscape!<p>
<!--endif-->
<!--sql database select * from table where user='$username'-->
<!--ifless $numentries 1-->
Sorry, that record does not exist<p>
<!--endif exit-->
Welcome <!--$user-->!<p>
You have <!--$index:0--> credits left in your account.<p>
<!--include /text/footer.html-->
PHP 3.0 是类似于如今 PHP 的第一个版本。1997 年,Andi Gutmans 和 Zeev Suraski 在为一所大学的项目中开发电子商务程序时发现 PHP/FI 2.0 功能明显不足,于是他们重写了代码。经过 Andi,Rasmus,和 Zeev 的一些列努力,考虑到 PHP/FI 已存在的用户群,他们决定合作开发一种新的,独立的编程语言。这个全新的语言伴随着一个新的名称发布,它从 PHP/FI 2.0 的名称中移除了暗含「本语言只限个人使用」的部分。它被命名为简单的缩写「PHP」。这是一种递归的缩写,全称是——PHP: Hypertext Preprocessor。
PHP 3.0 一个最强大的功能就是它的可扩展性。除了给最终用户提供数据库、协议和 API 的完善接口,它的可扩展性还吸引了大量的开发人员加入并提交新的模块。后来证实,这是 PHP 3.0 取得巨大成功的关键。PHP 3.0 中引入的其它关键功能包括面向对象的支持和更强大和协调的语法结构。
1998 年 6 月,随着来自世界各地的许多新开发者的加入,PHP 3.0 被新的 PHP 开发团队宣布为 PHP/FI 2.0 的官方后继版本。PHP/FI 2.0 的活跃发展,几乎在 1997 年 11 月停止,到此时正式结束。经过大约 9 个月的公开测试,当 PHP 3.0 正式发布的时候,它已经被安装在世界上的超过 70000 个域名上,并且不再局限于兼容 POSIX 的操作系统上。在 Windows 95,98 以及 NT, 还有 Macintosh 系统的服务器上,也有相对较小的份额。最高时候,PHP 3.0 被安装在互联网约 10% 的 web 服务器上。
1998 年冬天,官方发布 PHP 3.0 不久,Andi Gutmans 和 Zeev Suraski 开始重新编写 PHP 代码。设计目标是增强复杂程序运行时的性能和 PHP 自身代码的模块性。PHP 3.0 的新功能和广泛的第三方数据库、API 的支持使得编写这样的程序成为可能,但是 PHP 3.0 没有高效地处理如此复杂程序的能力。
新的被称为「Zend Engine」(这是 Zee 和 Andi 的缩写)的引擎,成功的实现了设计目标,并在 1999 年中期首次引入到 PHP 中。基于该引擎并结合了更多新功能的 PHP 4.0,在 PHP 3.0 发布两年后,于 2000 年 5 月发布了官方正式版本。除了更高的性能外,PHP 4.0 还包含了其它一些关键功能,比如:支持更多的 web 服务器;HTTP Sessions 支持;输出缓冲;更安全的处理用户输入的方法;一些新的语言结构。
PHP 5 在长时间的开发和多个预发布版本后,于 2004 年 7 月发布正式版本。它的核心是 Zend 引擎 2.0,引入了新的对象模型和大量新功能。
PHP 开发小组有很多优秀的开发人员,同时还有大量的优秀人才在进行 PHP 相关工程的开发工作,如 PEAR、PECL 和 PHP 文档工程,还有世界七大洲中的六个共超过一百个独立的 web 服务器的底层网络基础设施。虽然仅仅是基于过去几年的统计数据,我们可以充分相信 PHP 现在安装在世界上超过一千万甚至上亿的域名上。
PHP 5 之后理应是 PHP 6,但实际上 PHP 6 由于某些原因并未发布,最后直接跳到 PHP 7 了。
从 2005 年开始,曾尝试过一个新的主要版本,主要特性为支持 Unicode 标准,但最后由于实施起来遇到困难,在 2010 年被废除。除了支持 Unicode 外,为该版本添加的大多数功能都陆续并入 PHP 5.3 或 PHP 5.4 中。详细内容可以看见 官方说明。
2015 年 12 月,PHP 7.0 正式发布,这标志着新的主要 PHP 7 系列的开始。
PHP 7.0 使用了新版 Zend 引擎,带来了许多改进和新的特性,如:
性能提升:PHP 7 的速度比 PHP 5.6 提升了两倍
显著减少了内存使用量
抽象语法树
全面一致的 64 位支持
改进了异常层次结构
许多致命错误转换为异常
安全随机数产生器
移除了旧的和不受支持的 SAPI 和扩展
空合并操作符 ??
及组合比较符 <=>
返回和标量类型声明
匿名类
零成本断言
目前最新版本稳定版是 PHP 7.2.8,发布于 2018 年 7 月 19 日。
以下是各版本主要特性或更新日志:
完全重写日期处理代码,改进了时区支持
与 PHP 5.0 相比性能显著提升
默认启用 PDO 扩展
添加部分新函数,包括各种扩展函数和内置函数
修正超过 400 处错误
部分函数添加新的或可选参数
添加部分新函数
添加部分扩展(如 Filter,JSON,Zip)
添加命名空间支持
添加后期静态绑定支持
添加原生闭包(闭包/匿名函数)支持
添加魔术方法 __callStatic
和 __invoke
添加 Nowdoc 语法支持,类似于 Heredoc 语法,但是包含单引号
可以在类外部使用 const
关键字声明常量
三元运算符有了简写形式 ?:
添加动态访问静态方法支持
异常可以嵌套
添加循环引用的垃圾回收器,默认开启
移除魔术引号
新增支持 traits
新增短数组语法(方括号)
内置用于开发的 CLI 模式的 web server
添加部分新函数
不再支持 Windows XP 和 2003
新增生成器
新增 finally
关键字
foreach
支持 list()
empty
支持任意表达式
新的密码哈希 API
新增变量表达式定义常量
使用 ...
运算符定义变长参数函数
使用 ...
运算符进行参数展开
使用 **
进行幂运算
use function
及 use const
默认字符编码为 UTF-8
php://input
是可重用的了
支持上传 2GB 以上的大文件
使用 hash_equals()
比较字符串避免时序攻击
新增魔术方法 __debugInfo()
自定义 var_dump()
输出
SSL/TLS 改进
错误和异常处理变更
变量处理更好的一致性(PHP 7 使用抽象语法树来解析源代码)
foreach 不再改变内部数组指针
移除 mysql、mssql
移除 $HTTP_RAW_POST_DATA
,改用 php://input
标量类型和返回值类型声明
null 合并运算符 ??
太空船操作符(组合比较符) <=>
零成本断言
新的 PHP 解析引擎
nullable 类型(参数及返回值类型前加上 ? 使之允许为空)
新的返回值类型 void
类常量可见性
多异常捕获处理
object 类型
通过名称加载扩展
允许重写抽象方法
移除 MCrypt,可以用 OpenSSL 或 Sodium 代替