PHP

超文本预处理器(简称PHP)是一种通用编程语言,最初是为了进行网页开发而设计的。它最初是由拉斯马斯·勒德尔夫(Rasmus Lerdorf)在1994年创建的。[1]PHP引用现在是由The PHP Group实现的。PHP最初是个人主页(Personal Home Page)的缩写,[1]但现在它是一个首字母递归型缩略词,全称为Hypertext Preprocessor,即超文本预处理器。[2]

可以通过命令行界面执行PHP代码,也可以将其嵌入到超文本标记语言代码中,还可以与各种网页模板系统、网页内容管理系统和网页框架结合运用。PHP代码通常由PHP解释器处理,该解释器以网络服务器中的一个模块或公共网关接口(CGI)可执行文件的形式安装。网络服务器将解释过和执行后的PHP代码(可能是任何类型的数据,包括图像)结果与生成的网页相结合。PHP可以用于网络环境之外的许多编程任务,例如独立的图形应用程序[3]和无人机遥控。[4]

标准的PHP解释器由Zend引擎驱动,是发布的具有PHP许可证的自由软件。PHP已经得以广泛应用,可以免费安装到与几乎所有操作系统和平台的大多数网络服务器上。

2014年之前,PHP语言一直没有书面的正式规范或标准,最初的应用充当了其他应用需遵循的实际标准。自2014年以来,人们一直在努力制定一份正式的PHP规范。

1.1 早期历史

Rasmus Lerdorf编写了最初的公共网关接口(CGI)组件,并与Andi Gutmann和Zeev Suraski一起重写了PHP3的解析器。

PHP的开发始于1994年,当时拉斯马斯·勒德尔夫(Rasmus Lerdorf)用C语言编写了几个通用网关接口(CGI)程序,[6][7][8] 他将这些程序扩展,以与网络表单同时使用和与数据库进行通信,并将这种操作称为“个人主页/表单解释器”(简称 PHP/FI)。

PHP/FI可以用来构建简单的动态网络应用程序。为了提高 bug报告速度并改进代码,Lerdorf最初于1995年6月8日在Usenet讨论组comp.infosystems.www.authoring.cgi上宣布发布 “个人主页工具(PHP Tools)1.0版”的PHP/FI。[9][10] 这个版本的PHP已经具备了目前使用的PHP的基本功能,包括类Perl变量、表单处理以及嵌入超文本标记语言的能力。PHP的语法类似于Perl,但更简单、应用范围较小且一致性较弱。[11]

早期人们并不打算把PHP发展为一种新的编程语言,但后来PHP得以有机发展。勒德尔夫(Lerdorf)回忆道:“我不知道如何停止,也从来没想过创造一种编程语言。我完全不知道如何创造编程语言,我只是不断地按照逻辑思维走下一步。”[11] 一个开发团队开始组建,几个月的工作和测试之后, 1997年11月正式发布了PHP/FI 2。

最初,PHP不是人们专门创造出来的,而是自然形成的,这一事实造成了函数命及其参数排序的不一致。[12] 在某些情况下,函数命名是为了匹配PHP正在“包装”的低级库。[13] 而在一些早期的PHP版本中,函数名的长度用作内部散列函数,因此此时,命名是为了改善散列值的分布情况。[14]

1.2 PHP 3和PHP 4

1997年,齐夫·苏拉斯基(Zeev Suraski)和安迪·古特曼斯(Andi Gutmans)重新编写了解析器,为PHP 3奠定了基础,并将该语言的名称改为PHP。PHP是一个首字母递归型缩略词,中文全称为超文本预处理器。[11][15] 后来便开始公开测试PHP 3,其正式发布是在1998年6月。Suraski和Gutmans随后开始重新编写PHP的核心部分,并于1999年开发了Zend引擎。[16] 他们还在以色列的拉马特甘成立了泽德技术有限公司(Zend Technologies)。[11]

2000年5月22日,PHP 4发布,驱动引擎为Zend 1.0。[11] 截至2008年8月,已经出现了PHP 4.4.9版本。技术人员不会再对PHP 4进行任何开发,也不会再发布任何安全更新。[17][18]

1.3 PHP 5

2004年7月14日,PHP 5发布,由Zend引擎II(一个新的Zend引擎)驱动。[11] PHP 5具备一些新的特性,比如改进了对面向对象编程的支持,扩展了PHP数据对象(英文简称PDO,指轻薄且连续的访问数据库接口),许多性能都得以增强。[19] 。2008年,PHP 5成为开发过程中唯一稳定的一个版本。PHP各个版本一直缺少后期静态绑定,直至PHP 5.3版才将其添加进去。[20][21]

自2008年2月5日起,由于GoPHP5倡议的缘故,许多广受关注的开源项目不再支持新代码中的PHP 4。[22] GoPHP5倡议是由一个PHP开发者联盟发起的,他们致力于促进PHP 4到PHP 5的过渡。[23][24]

随着时间的推移,现在大多数的32位和64位操作系统都可以使用PHP解释器。有两种方式,一种是使用PHP源代码构建系统,另外一种是使用预先构建的二进制文件。[25]PHP 5.3和PHP 5.4唯一可用的微软Windows二进制系统是32位x86系列版本,[26][27]且在Window64位操作系统上使用互联网信息服务(IIS)时需要开启Windows32位系统兼容模式。PHP 5.5的出现促进Windows操作系统有了64位x86-64系列版本。[28]

PHP 5.6的官方安全支持已于2018年12月31日结束,[29]但Debian 8.0 Jessies将支持延长至2020年6月。[30]

1.4 PHP 6和统一码(Unicode)

由于缺乏核心语言级别的本机Unicode支持,人们对PHP的评价褒贬不一。[31][32] 2005年启动了一个由安德烈·兹米耶夫斯基(Andrei Zmievski)带头的项目,试图通过嵌入国际统一码组件(International Components for Unicode,英文简称ICU)库,并在内部将文本字符串表示为UTF-16,使PHP各个部分都具备本地Unicode支持。[33] 由于此举会引起语言内部和用户代码发生重大改变,因此他们计划将这一特质与当时正在开发的其他主要功能结合起来,作为PHP语言6.0版本发布。[34]

然而,由于开发人员不了解必要变化,且UTF-16(很少在网络环境中使用)的转换出现性能问题,上述项目被延迟。因此,2009年发布了PHP 5.3,该版本的诸多非Unicode特性都来自于PHP 6,尤其是名称空间。2010年3月,正式放弃该项目,并发布了PHP 5.4版本,该版本包含了PHP 6的许多其他非Unicode特性,例如Traits功能和闭包重新绑定功能。[35] 最初的设想是制定一份新的Unicode集成规划,但截至2014年,还没有采用任何一项规划。

1.5 PHP 7

2014至2015年期间技术人员开发了一个新的PHP主版本,编号为PHP 7。关于这个版本的编号有一些争论。[36]虽然PHP 6 Unicode是一个尝试,从未正式发布过,但有几篇文章和书名用了PHP 6这一说法。[37]如果新版本也用PHP 6命名的话,可能会造成混乱。人们在投票后采用了PHP 7这一名称。[38]

PHP的基础是最初叫做PHP下一代(英文简称phpng)的一个分支。phpng由德米特里·斯托戈夫(Dmitry Stogov)、陈欣·许(Xinchen Hui)和尼基塔·波波夫(Nikita Popov)创建,[39]旨在通过重构Zend引擎来优化PHP的性能,同时保持近乎完全的语言兼容性。[40]截至2014年7月14日,基于WordPress的基准工具(phpng项目的主要基准工具)显示PHP性能几乎提高100%。对phpng进行改动旨在使性能提高变得更容易一些,因为技术人员认为使数据结构变得更紧凑以及其他变化能够增大数据成功转移到即时编译器上的概率。[41]由于牵扯到上述重大变化,改动后的Zend引擎被称为Zend引擎3,取代了PHP 5中使用的Zend引擎2。[42]

就PHP的发布过程而言, phpng内部有重大变化,因此必须要赋予它一个新的主版本号,而不是PHP 5版本的次版本号。[43]各PHP主版本具备破坏代码向后兼容性的功能,因此PHP 7带来一个机会,这个机会可以让技术人员不受phpng的束缚,做其他方面的改进。在phpng内部做改进,需要破坏向后兼容性。具体包括以下几个方面的变化:

现代面向对象的异常取代许多严重或可恢复的遗留PHP错误机制[44]

改动之后,变量解引用的语法内部更加一致和完整,允许使用运算符“->”、“ ()”、“{}”、和“::”,以及任意有意义的左侧表达式[45]

不再支持传统PHP 4风格的构造方法[46]

foreach语句的行为变得更可预测[47]

之前,PHP内置的几类构造函数在失败时返回空值,为保持一致性,将返回空值改为抛出异常[48]

从PHP核心成分中删除了一些未维护的或不推荐使用的服务器应用程序编程接口和扩展,最突出的是遗留的mysql扩展[49]

对list()运算符的行为进行更改,以去除对字符串的支持[50]

去除对传统ASP样式分隔符,如“< %”和“% >”和“<脚本语言=”php ” >…</script >”,的支持已被删除[51]

之前存在允许switch语句具有多个默认子句的疏忽,改动后对此进行了修复[52]

从字符串到数字类型的某些隐式转换中不再支持使用十六进制数字[53]

改动左移位和右移位操作符,使其在平台间具有更加一致的表现[54]

整数和浮点数之间的转换更加严格,并且在不同平台之间的转换也更加一致[54][55]

PHP 7还包含了新的语言特性。最值得注意的是,该版本引入了函数的返回类型声明, 是对现有参数类型声明的一种补充,并支持参数和返回类型声明中的标量类型(整数、浮点、字符串和布尔值)。

以上就是这次的所有内容,更多欢迎关注编程学习网