PHP

                     

贡献者: 待更新

   (本文根据 CC-BY-SA 协议转载自原搜狗科学百科对英文维基百科的翻译)

图
图 1

   超文本预处理器(简称 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 规范。[5]

1. 历史

1.1 早期历史

图
图 2

   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]

图
图 3

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

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

图
图 4

1.2 PHP 3 和 PHP 4

图
图 5:这是 WordPress 内容管理系统的自定义 PHP 代码的一个示例。

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

1.6 版本发布历史记录

表1:
版本 发布日期 截止日期[56] 备注
1.0 1995 年 6 月 8 日 正式名称为个人主页工具(英文为 PHP Tools)。这也是“PHP”这个名称的首次使用。[11]
2.0 1997 年 11 月 1 日 正式名称为 PHP/FI 2.0。这是第一个具有 PHP 实际特色的版本。PHP/FI 2.0 是一种独立的语言,具有许多至今仍然沿用的特性。
3.0 1998 年 6 月 6 日 2000 年 10 月 20 日[56] 开发人员从一个人增至多个。齐夫·苏拉斯基(Zeev Suraski)和安迪·古特曼斯(Andi Gutmans)重新编写了该版本的基础部分。[11]
4.0 2000 年 5 月 22 日 2001 年 6 月 23 日[56] 引入了更高级的两阶段解析/执行标签解析系统,称为 Zend 引擎。[57]
4.1 2001 年 12 月 10 日 2002 年 3 月 12 日[56] 引入了超级全局变量(如“ \$_GET”、“\$_POST”、“\$_SESSION”等)。[57]
4.2 2002 年 4 月 22 日 2002 年 9 月 6 日[56] 默认禁用 register_globals 功能。通过网络接收的数据不再直接导入全局命名空间,从而填补了应用程序中可能存在的安全漏洞。[57]
4.3 2002 年 12 月 27 日 2005 年 3 月 31 日[56] 引入了命令行界面来对 CGI(通用网关接口)加以补充。[58]
4.4 2005 年 7 月 11 日 2008 年 8 月 7 日[56] 通过破坏与 PHP 4.3.x 编译扩展的二进制兼容性修正了一个内存损坏的错误。[59]
5.0 2004 年 7 月 13 日 2005 年 9 月 5 日[56] 引入带有一个新对象模型的 Zend 引擎 II。[60]
5.1 2005 年 11 月 24 日 2006 年 8 月 24 日[56] 通过在重新设计的 PHP 引擎中引入编译器变量提高了性能。[60]将 PHP 数据对象(PDO)作为访问数据库的一致接口引入。[61]
5.2 2006 年 11 月 2 日 2011 年 1 月 6 日[56] 默认启用过滤器扩展。支持本地 JSON 文件。[60]
5.3 2009 年 6 月 30 日 2014 年 8 月 14 日[56] 具备以下特点:支持命名空间、后期静态绑定、跳转标签(转到位置受限)、闭包、PHP 档案(英文简称为 phar)、循环引用垃圾收集、Window 系统支持得以改进、sqlite3、mysqlnd 取代 libmysql 成为与 MySQL 一起使用的扩展的底层库、fileinfo 取代 mime_magic 以更好地支持 MIME、国际化扩展和废弃使用 ereg 扩展。
5.4 2012 年 3 月 1 日 2015 年 9 月 3 日[56] 支持 Trait 功能、支持使用短数组语法,并移除以下条目:register_globals、safe_mode、allow_call_time_pass_reference、session_register()、session_unregister()和 session_is_registered();使用内置网络服务器;[62]在现有功能、性能和内存需求方面有所改进。
5.5 2013 年 6 月 20 日 2016 年 7 月 10 日[63] 支持使用生成器和 finally 块(用于处理异常);官方发行版本捆绑 OpCache(以 Zend Optimizer+为基础)。[64]
5.6 2014 年 8 月 28 日 2018 年 12 月 31 日[63] 具有以下特性:常量标量表达式、变量函数、参数解包、新的指数运算符、use 语句扩展函数和常量、以 SAPI 模块形式存在的新 phpdbg 调试器以及其他较小的改进。[65]
6.x Not released 不适用 该废弃 PHP 版本原计划引入本机 Unicode 支持。[66][67]
7.0 2015 年 12 月 3 日[68] 2018 年 12 月 3 日[43] 使用 Zend 引擎 3(性能有所改进和在 Windows 系统上支持[41]使用 64 位整数)[69];使用统一变量语法;[45]编译过程以 AST(抽象语法树)为基础;[70]引入“闭包::call()”;[71]实现平台间的按位移位一致性;[72]
7.0 2015 年 12 月 3 日[68] 2018 年 12 月 3 日[43] 使用 Zend 引擎 3(性能有所改进和在 Windows 系统上支持[41]使用 64 位整数)[69];使用统一变量语法;[45]编译过程以 AST(抽象语法树)为基础;[70]引入“闭包::call()”;[71]实现平台间的按位移位一致性;[72]使用“??(coalesce 函数传空)[73]”运算符和 Unicode 代码点转义语法;[74]引入返回类型声明、标量类型(如整数、浮点、字符串和布尔值等)声明和 太空船三向比较运算符“$< = >$”[75];生成器获授权;[76]使用匿名的类;[77]使用更简单且更一致的可用 CSPRNG 应用编程接口;[78]用更现代的异常替换许多遗留的 PHP 内部错误;[44]使用简写语法以从命名空间导入多个条目。[79]
7.0 2015 年 12 月 3 日[68] 2018 年 12 月 3 日[43] 使用 Zend 引擎 3(性能有所改进和在 Windows 系统上支持[41]使用 64 位整数)[69];使用统一变量语法;[45]编译过程以 AST(抽象语法树)为基础;[70]引入“闭包::call()”;[71]实现平台间的按位移位一致性;[72]使用“??(coalesce 函数传空)[73]”运算符和 Unicode 代码点转义语法;[74]引入返回类型声明、标量类型(如整数、浮点、字符串和布尔值等)声明和 太空船三向比较运算符“$< = >$”[75];生成器获授权;[76]使用匿名的类;[77]使用更简单且更一致的可用 CSPRNG 应用编程接口;[78]用更现代的异常替换许多遗留的 PHP 内部错误;[44]使用简写语法以从命名空间导入多个条目。[79]
7.1 2016 年 12 月 1 日 2019 年 12 月 1 日[63] 引入 void 返回类型和类常量的可见性修饰符[80][81]
7.2 2017 年 11 月 30 日 2020 年 11 月 30 日[63] 使用对象参数;支持返回类型提示;[82]使用 Libsodium 扩展;[83]抽象方法重写;[84]拓展参数类型[85]
7.3 2018 年 12 月 6 日[86] 2021 年 12 月 6 日 使用灵活的 Heredoc 和 Nowdoc 语法;[87],支持使用 list()进行引用分配和数组解构;[88],支持 PCRE 2[89], 和 hrtime()函数[90]
7.4 2019 年 11 月 21 日 2022 年 12 月 类型属性为 2.0;[92]支持预加载;[93]使用空合并赋值运算符;[94]改进 openssl_random_pseudo_bytes;[95]支持弱引用;[96]使用外部函数接口(英文简称为 FFI)[97]哈希扩展始终可用;[98]使用密码哈希注册表、[99]拆分了的多字节字符串、[100]引用反射、[101]拆分扩展/wddx[102]以及新的自定义对象序列化机制[103]
8.0 2020 年第四季度或 2021 年第一季度 2023 年第四季度或 2024 年第一季度 采用准时制编译(JIT);[104]使用以负索引开始的数组;[105]内部函数[106]的一致类型错误[107]
格式:旧版本旧版本,仍被支援当前版本最新的预览版未来版本

   PHP 开发团队从 2011 年 6 月 28 日开始使用一个发布新版本的时间表。[43] 根据这个时间表的安排,每个月至少应该发布一次新版本,每年应该发布一次包含新功能的次级版本。每个次级版本的有效期至少需包括两年的安全和错误修复期以及至少一年的安全修复期,因此每个次级版本的整个发布过程总共需要至少三年。期间,不会引入新功能(不包括小且独立的功能)。

2. 吉祥物

图
图 6:PHPant,PHP 的吉祥物。

   PHP 项目的吉祥物叫做 elePHPant(意为大象),是一头侧面有 PHP 标志[108]的蓝色大象,由文森特·庞蒂尔(Vincent Pontier)于 1998 年设计。[109]“从侧面看,这些字母(指 PHP 三个字母)构成了一头大象的模样。”[110] 有时,长毛绒 elePHPant 玩具的颜色有所不同。

   多年来,出现了许多吉祥物变体,但只有以文森特·庞蒂原始设计为基础的吉祥物得到了计算机领域的官方认可。[111]它们具有很大的收藏价值,而且其中一些极其罕见。《PHP 吉祥物 “大象” 指南》(A Field Guide to Elephants)中列出了不同的吉祥物变体。

3. 语法

   下面的 “ 你好,世界!” 程序是用嵌入在超文本标记语言文档中的 PHP 代码编写的:

<!DOCTYPE html>
<title>PHP "Hello, World!" program</title>
<?php echo '<p>Hello World</p>'; ?>
然而,由于不需要将 PHP 代码嵌入到超文本标记语言中,可省略包含纯 PHP 代码的文件中的结束标记,从而形成像下面这种最简单的版本:[112]
<?='Hello world';
PHP 解释器只在其分隔符内执行 PHP 代码。其分隔符外的任何内容都不会被 PHP 处理,尽管非 PHP 文本仍然受 PHP 代码中控制结构的管控。最常见的分隔符是 “<?php to open and ?> to close PHP”,简写为 “<?”。该简写分隔符降低了脚本文件的可移植性。由于可以在本地 PHP 配置中禁用对脚本文件的支持,因此不鼓励使用该简写分隔符。[113][114] 但业界并不反对使用其 echo 短标签 “<?=”。[115] 在 PHP 5.4.0 发布之前,只在 short_open_tag 配置设置启用的情况下使用 “echo()” 这一简短语法;但在 PHP 5.4.0 及后来的各版本中,任何时候都可以使用 “echo()”。[116][117][113] 使用上述分隔符的目的是区分 PHP 代码与非 PHP 内容(如 JavaScript 代码或 HTML 标记 等)。[118]

   分隔符 “<?php” 和 “?>” 在 XHTML 和其他 XML 文档中的第一种格式能够创建正确格式的 XML 处理指令。[119] 这意味着服务器端文件中 PHP 代码和其他标记混合使用产生的文件本身就是格式良好的 XML 文件。

   变量用美元符号作为前缀,不需要预先指定类型。PHP 5 引入了类型提示,允许函数强制其参数作为特定的类、数组、接口或回调函数的对象。然而,在 PHP 7.0 发布之前,类型提示不适用于标量类型,如整数或字符串。[120]

   与函数名和类名不同,变量名有大小写之分。双引号("")和 heredoc 字符串都具备将变量值插入字符串的能力。[120]PHP 以自由格式语言的方式将换行符视为空白字符,分号标志语句结束。[121]PHP 有三种类型的注释语法,分别为/* */标记块、/* */内联注释和用于单行注释的//和#。[122]echo 语句是 PHP 用来输出文本的几种工具之一。

   PHP 的关键字和语法风格与 C 语言风格类似。PHP 的 if 条件、for 和 while 循环以及函数返回值在语法上都与 C 语言、C++语言、C#语言、Java 语言和 Perl 语言等相似。

3.1 数据类型

   整数以相关平台范围的格式储存在 PHP 中,可以是相当于 C 语言长整数的 64 位有符号整数,也可以是 32 位的有符号整数。在特定情况下,无符号的整数被转换为有符号的值,这点与其他编程语言不同。[123]使用十进制(正和负)、八进制、十六进制和二进制符号对整数变量进行赋值。

   浮点数以特定平台范围的格式存储在 PHP 中。可以用浮点符号或两种形式的科学符号来指定浮点数。[124]PHP 有一个本地布尔类型,与 Java 和 C++语言的本地布尔类型相似。[124]根据布尔类型转换规则,将非零值解释为真、零值解释为假,与 Perl 和 C++语言中的操作一样。[124]

   空数据类型指没有值的变量,只包括空值这一个值。

   资源类型中的变量表示对外部资源的引用,通常由源于特定扩展的函数创建,并且只能由来自同一扩展的函数处理。实例包括文件、图像和数据库资源。[124]

   数组包括 PHP 能够处理的任何类型的元素,包括资源、对象,甚至其他数组。次序保存在值的列表中以及键和值的散列中,并且列表和散列可以混合使用。[124]PHP 还支持字符串,字符串可以与单引号、双引号、nowdoc 或 heredoc 语法一起使用。[125]

   标准 PHP 库(英文简称 SPL)试图解决标准方面的问题,并具备高效的数据访问接口和类。[126]

3.2 函数

   PHP 用核心语言定义了大量函数,其中许多函数在各种扩展中可以继续使用。[127] 线上 PHP 文档详细记录了这些函数。但是,内置库中存在各种各样的命名习俗及与其相关的不一致性,这一点在前面的 “历史” 部分中就已提及。

   开发人员可对自定义函数进行定义:

function myAge(int $birthYear):string {
    // calculate the age by subtracting the birth year from the current year.
    \$yearsOld = date('Y') - $birthYear;

    // return the age in a descriptive string.
    return $yearsOld . ' year' . ($yearsOld != 1 ? 's' : '');
}

echo 'I am currently ' . myAge(1995) . ' old.';
2019 年时,上述示例程序的输出为 “ 我今年 24 岁。”

   PHP 中,函数可以被包含它们名字的字符串引用,而不是被函数指针引用。这种方式使普通的 PHP 函数也可以被使用,例如,作为回调函数被使用或者在函数表中被使用。[128]任何时候都可以创建用户定义函数,而无需将其原型化。[127][128]可以在代码块中定义函数,允许运行时决定是否应该定义函数。使用函数 “function_exists” 来确定是否已经对有特定名称的函数进行定义。必须使用括号调用函数,但用 PHP 运算符 “new” 调用零参数类构造函数时除外,此时,可以不使用括号。

   PHP 5.3 之前的各版本均不支持匿名函数和闭包。虽然从 PHP 4.0.1 开始就有 “create_function()”,但它只是作为 eval()的一个瘦包装器存在,在程序执行期间允许创建正常的 PHP 函数。[129]PHP 5.3 添加了定义匿名函数或 “ 闭包” 的语法,可以从周围捕获变量:

function getAdder($x) {
    return function($y) use ($x) {
        return $x + $y;
    };
}

$adder = getAdder(8);
echo $adder(2); // prints "10"

   在上面的示例中,getAdder()函数使用经传递的参数\$x(关键字 use 从词法上下文中导入一个变量)创建了一个闭包,然后使用另外一个参数\$y,将创建的闭包返回给调用方。这种函数属于第一类对象,也就是说它可以存储在某一变量中,也可以作为参数传递给其他函数等等。[130]

   不同寻常的是,尽管 PHP 使用的是动态类型语言,却支持函数参数的类型声明,这些声明是在运行时强制执行的。从 PHP 5.0 开始支持类和接口的类型声明;从 PHP 5.1 开始支持数组的类型声明;从 PHP 5.4 开始支持 “ 可调用” 参数的类型声明;从 PHP 7.0 开始支持标量(包括整数、浮点、字符串和布尔等)的类型声明。[120] PHP 7.0 中还包括函数返回类型的类型声明,表示方法为把类型名称放在参数列表之后,并在前面加上冒号。[131] 例如,在 PHP 7 中,上一例子中的 getAdder 函数可以用类似下面的类型进行注释:

function getAdder(int $x):Closure {
    return function(int $y) use ($x):int {
        return $x + $y;
    };
}

$adder = getAdder(8);
echo $adder(2); // prints "10"
echo $adder(null); // throws an exception because an incorrect type was passed
$adder = getAdder([]); // would also throw an exception
默认情况下,标量类型声明遵循弱类型原则。例如,如果一个函数的参数类型是 int,PHP 不仅允许将整数,还允许将可转换的数字字符串、浮点数或布尔值传递给该函数,并对它们进行转换。[120]然而,PHP 7 中有一个叫做 “ 严格类型” 的模式。当使用该模式时,不允许对函数调用值和文件中的返回值进行上述转换。[120]

3.3 PHP 对象

   PHP 3 中添加了基本的面向对象编程功能,该功能在 PHP 4 中得以改进。[131]这加深了 PHP 的抽象化,降低了使用 PHP 的程序员完成创造性任务的难度。PHP 5 中,对象处理程序被完全重写,功能集得以扩展,性能得以提高。[131]在 PHP 的早期版本中,处理对象的方式与处理值类型的方式雷同。[131]这种处理方式有一个缺点——如果代码想要修改传递给它的对象,而不是创建对象的副本,就必须使用大量的 PHP “ 引用” 变量。在 PHP 5 采用的新方法中,对象由句柄引用,而不是由值引用。

   PHP 5 引入了私有成员变量和方法以及受保护的成员变量和方法,还有抽象类、最终类、抽象方法和最终方法。PHP 5 也引入了一种标准的方法,用于对构造函数和析构函数进行声明,这一做法类似于其他面向对象语言,如 C++语言。PHP 5 还引入了一种标准的异常处理模型。此外,PHP 5 增加了接口,并允许使用多个接口。有一些特殊的接口允许对象与运行时系统进行交互。可以将实现数组访问的对象与数组语法一起使用,还可以同时使用实现迭代器或迭代器集合的对象和 foreach 语言构造。引擎中没有虚拟表功能,因此在编译时,绑定静态变量使用的是名称而非引用值。[132]

   开发人员使用保留字 “clone” 创建对象副本时,Zend 引擎会检查是否定义了一种__clone()方法。如果没有定义,Zend 引擎就会调用默认的__clone()来复制对象的属性;如果已经定义了一种__clone()方法,引擎就会负责在创建的对象中设置必要的属性。为了方便起见,Zend 引擎会提供一个导入源对象属性的函数,这样的话,程序员就可以开始按值复制源对象和需要更改的属性。[133]

   下面是一个简单的 PHP 中面向对象编程实例:

1 <?php
 2 abstract class User {
 3 	public string $name;
 4 
 5 	public function __construct(string $name) {
 6 		$this->name = $name;
 7 	}
 8 
 9 	public function greet():string {
10 		return "Hello, my name is " . $this->name;
11 	}
12 
13 	abstract public function job():string;
14 }
15 
16 class Student extends User {
17 	public string $course;
18 
19 	public function __construct(string $name, string $course) {
20 		$this->course = $course;
21 		parent::__construct($name);
22 	}
23 
24 	public function job():string {
25 		return "I learn " . $this->course;
26 	}
27 }
28 
29 class Teacher extends User {
30 	public array $teachingCourses;
31 
32 	public function __construct(string $name, string...$teachingCourses) {
33 		$this->teachingCourses = $teachingCourses;
34 		parent::__construct($name);
35 	}
36 
37 	public function job():string {
38 		return "I teach " . implode(", ", $this->teachingCourses);
39 	}
40 }
41 
42 $students = [
43 	new Student("Alice", "Computer Science"),
44 	new Student("Bob", "Computer Science"),
45 	new Student("Charlie", "Business Studies"),
46 ];
47 $teachers = [
48 	new Teacher("Dan", "Computer Science", 
"Information Security"),
49 	new Teacher("Erin", "Computer Science", 
"3D Graphics Programming"),
50 	new Teacher("Frankie", "Online Marketing", 
"Business Studies", "E-commerce"),
51 ];
52 
53 echo "Students: \n";
54 foreach($students as $student) {
55 	echo $student->greet() . ", " . $student->job() . "\n";
56 }
57 
58 echo "Teachers: \n";
59 foreach($teachers as $teacher) {
60 	echo $teacher->greet() . ", " . $teacher->job() . "\n";
61 }
62 
63 // Output of program:
64 // Students:
65 // Hello, my name is Alice, I learn Computer Science
66 // Hello, my name is Bob, I learn Computer Science
67 // Hello, my name is Charlie, I learn Business Studies
68 // Teachers:
69 // Hello, my name is Dan, I teach Computer Science,
 Information Security
70 // Hello, my name is Erin, I teach Computer Science, 
3D Graphics Programming
71 // Hello, my name is Frankie, I teach Online Marketing,
 Business Studies, E-commerce
技术人员使用关键字 “公有(public)”、“私有(private)” 和 “受保护(protected)” 定义 PHP 属性和方法的可见性。如果只使用 “var”,则默认为 “公共”。var 是 public(公共)的同义词。可在任何地方访问声明为 “公共” 的项。声明为 “受保护” 的项则表明限制对继承类(以及定义该项的类)的访问。声明为 “private” 的项仅对定义该项的类可见。[134] 相同类型的对象可以访问彼此的私有项和受保护项,即使它们之间存在差异。

4. 应用

   最初唯一完整且使用最广泛的 PHP 应用简称为 PHP,由 Zend 引擎驱动。为了与其它应用区分开来,有时将其非正式地称为 “Zend PHP”。Zend 引擎将 PHP 源代码动态编译成它可以执行的内部格式,因此 Zend 引擎相当于一个解释器。[135][136]由于 PHP 没有正式的规范,Zend 引擎也是 PHP 的 “引用应用”,Zend PHP 的语义也就定义了 PHP 的语义。由于 PHP 的语义复杂而微妙(这一点取决于 Zend 引擎的工作方式),存在竞争关系的各种 PHP 应用都很难具备完全的兼容性。

   PHP 采用单请求/脚本执行模型,而且 Zend 引擎实际上是一个解释器,二者导致了 PHP 效率低下。因此,技术人员开发了各种产品来帮助提高 PHP 性能。为了加快执行速度且不必在每次访问网页时都要编译 PHP 源代码,也可以使用操作码缓存(opcode cache)在 Zend 引擎的内部格式中安装 PHP 脚本。操作码缓存的工作方式是缓存共享内存中编译形式的 PHP 脚本(操作码),以避免每次脚本运行时,解析和编译代码都要产生费用。PHP 5 及之后的各个版本中都有一个叫做 Zend Opcache 的内置操作码缓存。[137]另一个得以广泛使用的操作码缓存是可选 PHP 缓存(英文简称 APC),在 PHP 中以 PECL 扩展的形式存在。[138]

   虽然 Zend PHP 仍然是最流行的 PHP 应用,但是也已经开发了其它几种应用。其中一些为编译器,也有一些支持 JIT 编译,因而虽然它们的性能优于 Zend PHP,但却缺乏完整的 PHP 兼容性。其它的应用包括以下几种:

5. 许可

   PHP 是符合《PHP 许可证》要求的自由软件,该文件规定:[143]

   未经 group@php.net 事先书面许可,本软件衍生的产品不得以 PHP 命名,且其名称中不可出现 PHP。软件开发商可用 “Foo for Php” 来表明软件与 PHP 可协同工作,但不可使用 “PHP Foo” 或 “phpfoo” 这两种说法。

   这种对使用 “PHP” 这一称呼的限制使得 PHP 许可证与通用公共许可证(GPL)不兼容,Zend 许可证也由于存在与原始 BSD 许可证相似的广告条款而不兼容。[144]

6. PHP 发展及社区

   PHP 的源代码分发过程涉及各种自由库和开源库,这些库可以用于生成的 PHP 二进制版本。从根本上意义上说,PHP 是一个互联网感知系统,配备了用于访问文件传输协议(FTP)服务器和许多数据库服务器的内置模块。这些服务器包括 PostgreSQL、MySQL、微软 SQL Server 和 SQLite(一种嵌入式数据库)以及 LDAP 服务器等。在标准的 PHP 版本中,存在许多 C 语言程序员熟悉的函数,比如 stdio 系列函数。[145]

   PHP 允许开发人员用 C 语言编写扩展,为 PHP 语言添加功能。可以将 PHP 扩展静态编译成 PHP,也可以在运行时动态加载 PHP 扩展。技术人员已经编写了许多扩展来更好地支持 Windows 系统应用编程接口、类 Unix 操作系统上的进程管理、多字节字符串(Unicode)、cURL 和几种流行的压缩格式。经由扩展实现的其它 PHP 特性包括实现与 IRC 的集成、可动态生成图像和 Adobe 闪存内容、PHP 数据对象(PDO)以用于访问数据库的抽象层的形式存在,[146][147][148][149][150][151][152] 以及语音合成。PHP 语言的一些核心功能(如处理字符串和数组的功能)也是作为扩展实现的。[153] PHP 扩展社区图书馆(PECL)项目是 PHP 语言扩展的存储库。[154]

   其他一些项目,如 Zephir,具备用高级语言创建 PHP 扩展并编译成本地 PHP 扩展的能力。与直接用 C 语言编写 PHP 扩展的方式相比,这种方法简化了扩展的开发过程,减少了编程和测试所需的时间。[155]

   截至 2018 年 12 月,PHP Group 由 10 人组成,分别为 Thies C. Arntzen、Stig Bakken、Shane Caraveo、Andi Gutmans、Rasmus Lerdorf、Sam Ruby、Sascha Schumann、Zeev Suraski、Jim Winstead 和 Andrei Zmievski。[156]

   Zend Technologies 有限公司设置了一个 PHP 5.5 考试的 PHP 证书(PHP Certification),通过考试的程序员即可成为具备认证资格的 PHP 开发人员。

7. 安装和配置

   可通过两种基本方法为网络服务器添加对 PHP 的支持,一种是以本地网络服务器模块的形式,另一种是以 CGI 可执行文件的形式。PHP 中有一个名为服务器应用程序编程接口(SAPI)的直接模块接口,许多网络服务器都支持这个接口,包括阿帕奇服务器、微软 IIS、Netscape(现已失效)和 iPlanet。其他一些网络服务器,如 OmniHTTPd,支持互联网服务器应用编程接口(ISAPI),这是微软的网络服务器模块接口。如果 PHP 中没有对网络服务器的模块支持,就可以一直将其用作公共网关接口(CGI)或 FastCGI 处理器。在这种情况下,网络服务器的配置方式是使用 PHP 的 CGI 可执行文件来处理与 PHP 文件相关的所有请求。[157]

   PHP-FPM(FastCGI 处理管理器)是另外一种可行的 FastCGI 应用。它从 5.3.3 版开始就与正式的 PHP 发行版捆绑在一起。[158] 与旧的 FastCGI 版本相比,它具备一些特性,这些特性对负载沉重的网络服务器非常有帮助。[159]

   使用 PHP 编写命令行脚本时,需要有一个可执行的 PHP 命令行界面。PHP4.3.0 及以后的版本都支持命令行界面服务器应用程序编程接口(SAPI)。[160] 引入该接口的重心是使用 PHP 开发 shell 应用程序。尽管命令行界面服务器应用程序编程接口和其它服务器应用程序编程接口有许多相似点,但它们之间存在相当大的差异。[161]

   PHP 有一个叫做 SAPI 的直接模块接口,适用于不同的网络服务器,[157] 以一个名为 php5apache2.dll 的 DLL 文件的形式存在于 Windows 系统的 PHP 5 和 Apache 2.0。[162] 这个 DLL 文件是一个模块,除了具备其他功能之外,它还在 PHP 和网络服务器之间有一个接口,这个接口是以服务器可以理解的形式安装的。这种形式被称为 SAPI。

   各种网络服务器扩展都有不同种类的 SAPI。例如,除了上面列出的那些,PHP 语言的 SAPI 还包括公共网关接口(CGI)和命令行接口(CLI)。[157][160]

   还可以通过使用 PHP-GTK 扩展编写桌面图形用户界面(GUI)应用程序。各个 PHP 官方版本中都不包括 GTK。[157]GTK 只能以扩展的形式存在于 PHP 5.1.0 及以后的版本中。最常见的安装 PHP-GTK 的方法是用源代码对其进行编译。[163]

   在云环境中安装和使用 PHP 时,提供的软件开发工具包可以帮助发挥只有云环境才具备的特点,例如:

   PHP 支持许多配置选项,但这影响了 PHP 的核心特性和扩展。[166][167]可在不同位置对配置文件 “php.ini” 进行搜索,[168]这取决于 PHP 的使用方式。配置文件包含不同的部分,[169]也可以在网络服务器配置中设置其中的一些配置选项。[170]

8. 运用

图
图 7:一个广泛的概述 LAMP 软件包,和 Squid 一起在图示中。

   PHP 是一种通用脚本语言,非常适用于服务器端的网络开发。在这种情况下,PHP 通常在网络服务器上运行。PHP 运行时,被请求文件中的任何 PHP 代码都得以执行,通常是为了创建动态网页内容或网站或用于其他地方的动态图像。[171] 还可将 PHP 语言用于命令行脚本和客户端图形用户界面应用程序中。大多数网络服务器以及许多操作系统和平台都支持 PHP,并且可以将其与许多关系数据库管理系统(RDBMS)一起使用。大多数网络托管商支持 PHP 以供其客户使用。PHP 是免费的,PHP Group 为用户提供完整的源代码,用户可根据自己的实际情况进行构建、定制或扩展。[172]

图
图 8:动态网页:服务器端脚本示例(PHP 和 MySQL)。

   PHP 主要以过滤器的形式发挥作用,即从包含文本和/或 PHP 指令的文件或流中获取输入信息,并输出另一个数据流。尽管输出的形式有很多,比如 JSON、XML 和二进制数据(如图像或音频格式)等,但是最常见的输出是超文本标记语言。自 PHP 4 发布以来,PH 解析器对输入的信息进行编译,生成字节码供 Zend 引擎处理,性能比解释器(其前身)更佳。[172]

   PHP 最初是为了创建动态网页而设计的,现在其重心为服务器端脚本编写。[173]PHP 与其它服务器端脚本编写语言类似,都是从网络服务器向客户端提供动态内容的。这样的语言包括微软的 ASP.NET、Sun Microsystems 的 JavaServer Pages[174]以及 mod_perl。PHP 还促进了许多软件框架的开发,这些框架具备构建块和设计结构,可促进快速应用程序的开发。此类框架包括 PRADO、CakePHP、Symfony、CodeIgniter、Laravel、Yii Framework、Phalcon 和 Zend Framework,具备与其他网络框架类似的功能。

   作为一种网络应用程序部署方式,LAMP 架构已经在网络行业流行起来。[175]PHP 与 Linux、Apache 和 MySQL 一起使用时,通常用大写字母 “P” 来代表 PHP,尽管 P 也可以指 Python、Perl 或者三者的某种混合体。类似的软件包,如 WAMP 和 MAMP,也可用于 Window 和 macOS 系统,用第一个字母代表各自的操作系统。虽然 macOS 系统基础安装包含 PHP 和 Apache 的安装,但是用户希望这些软件包的安装机制能够更简单,也就是降低维持最新版本的难度。

   截至 2007 年 4 月,超过 2000 万个互联网域对安装了 PHP 的服务器实施了网络托管服务,而且记录显示,mod_php 是最受欢迎的 Apache HTTP 服务器模块。[176]截至 2018 年 6 月,83.5%的网站将 PHP 作为服务器端编程语言使用,可以在这些网站上选择使用哪种语言。用 PHP 编写的网络内容管理系统包括 MediaWiki、[177] Joomla、[178] eZ Publish、eZ Platform、SilverStripe、[179]WordPress、[180]Drupal[181]和 Moodle。[182]用 PHP 编写的网站(包括后台和/或面向用户的部分)包括 Fackbook、[183]Digg、[184]Tumblr、[185]Dailymotion[186]和 Slack。[187]

   在特定的和更高级的使用场景下,PHP 采用一种发展成熟且以形成文字的方法,来用 C 或 C++语言编写自定义扩展。[188][189][190][191][192][193][194] 除了能够以附加库的形式扩展语言本身之外,扩展还能帮助提高执行速度,其中,PHP 至关重要,而且在使用真正的编译语言方面还有改进的空间。[195][196] PHP 还可以通过一些明确的方式将自己嵌入到其它软件项目中。这样的话,就可以很容易地将 PHP 作为另一个项目的内部脚本语言使用,同时还能与项目特定内部数据结构建立紧密连接。[197]

   由于 PHP 在核心语言层面上缺乏对多线程的支持,[198]尽管线程的使用是通过 PECL 扩展” pthreads” 实现的,评价还是褒贬不一。[199][200]

   截至 2013 年 1 月,超过 2.4 亿个网站(占抽样网站的 39%)使用 PHP,并且有 210 万个网络服务器上安装了 PHP。[201]

   已经为 PHP 开发了一个命令行界面、php-cli 和两个 ActiveX Windows 脚本主机脚本引擎。

9. 安全

   2017 年,国家漏洞数据库(National Vulnerability Database)列出的所有漏洞中,有 3%与 PHP 相关。[202]自 1996 年以来,该数据库中列出的所有漏洞中,约有 30%与 PHP 相关。语言本身或其核心库的技术安全缺陷并不常见(2009 年有 22 个,约占总数的 1%,尽管 PHP 适用于约 20%的所列程序)。[203]认识到程序员会犯错之后,带有污点检查功能的一些语言可自动检测输入验证的缺失,自动检测输入验证缺失会导致许多问题。现在,技术人员正在为 PHP 开发该自检功能,[204]但是之前,将其用于 PHP 中的提议已经被拒绝过好几次了。[205][206]

   一些高级保护补丁,如 Suhosin 和 Hardening-Patch,是专门为网站托管环境设计的。[207]

   历史上,PHP 旧版本中有一些运行时的配置参数和缺省值,这使得一些 PHP 应用程序容易出现安全问题。其中,magic_quotes_gpc 和 register_globals[208]配置指令最为著名;后者可以将任何网址参数变为 PHP 变量,允许攻击者设置任何未经初始化的全局变量值,并干扰 PHP 脚本的执行,从而导致严重的安全漏洞。从 PHP 5.3.0 开始,不再支持 “魔术引号” 和 “注册全局变量” 设置,PHP 5.4.0 及以后的版本不再具备上述两种设置。[209]

   另一个潜在运行设置漏洞是因为未能禁用 PHP 执行(可通过使用引擎配置指令实现)[210]存储上传文件的目录。启用该功能可能会导致 PHP 执行嵌入在上传文件中的恶意代码。[211][212][213]有两种最安全的操作,一种是将图像目录定位在网络服务器可用的文档根目录之外的地方,并通过中间脚本提供图像目录,另一种是将 PHP 执行存储上传文件目录的功能禁用。

   此外,在共享的网络托管环境中启用动态加载 PHP 扩展(使用 enable_dl 配置指令)[214]会造成安全问题。[215]

   隐含类型转换可能会导致不同值的处理结果相同,在一些情况下,这违背了程序员的意图,也会导致安全问题。例如,比较 0e1234 = = 0 的结果为真,因为多边的值被当成了数值为零的科学符号 0×101234。比较 MD5 密码散列时,类似的错误会导致 Simple Machines Forum、[216]Typo3[217]和 phpBB[218]出现身份验证漏洞。由于 0e1234 = = = 0 的结果是 false,因此推荐的解决办法是使用 hash_equals()(为了定时攻击安全)、strcmp 或 identity 运算符(= = = =)等。[219]

   2013 年,Zone-H 发表了其对超过 170000 万网站损坏的分析,其中提到最常用的(53%)技巧是利用文件包含漏洞,主要与 PHP 函数 “包括(include)”、“要求(require)” 和 “allow_url_fopen” 的不安全使用有关。[220][221]

10. 参考文献

   [1] ^"History of PHP". php.net..

   [2] ^PHP Manual: Preface, www.php.net..

   [3] ^"Introduction: What can PHP do?". PHP Manual. Retrieved 2009-03-05..

   [4] ^:helicopter: Port of node-ar-drone which allows user to control a Parrot AR Drone over PHP: jolicode/php-ar-drone, JoliCode, 2019-01-11, retrieved 2019-02-23.

   [5] ^Jackson, Joab (2014-07-31). "PHP gets a formal specification, at last". ITworld. IDG..

   [6] ^Lerdorf, Rasmus (2012-07-20). "I wonder why people keep writing that PHP was ever written in Perl. It never was. #php". Twitter. Retrieved 2014-09-04..

   [7] ^Lerdorf, Rasmus (2007-04-26). "PHP on Hormones" (mp3). The Conversations Network. Retrieved 2009-06-22..

   [8] ^Lerdorf, Rasmus (2007). "Slide 3". slides for 'PHP on Hormones' talk. The PHP Group. Retrieved 2009-06-22..

   [9] ^Lerdorf, Rasmus (June 8, 1995). "Announce: Personal Home Page Tools (PHP Tools)". Retrieved 7 June 2011..

   [10] ^Lerdorf, Rasmus (1995-06-08). "Announce: Personal Home Page Tools (PHP Tools)". Newsgroup: comp.infosystems.www.authoring.cgi. Retrieved 2006-09-17..

   [11] ^"Rasmus Lerdorf, Senior Technical Yahoo: PHP, Behind the Mic". 2003-11-19. Archived from the original on 2013-07-28..

   [12] ^"Problems with PHP". Retrieved 20 December 2010..

   [13] ^"php.internals: Re: Function name consistency". news.php.net. 2013-12-28. Retrieved 2014-02-09..

   [14] ^Rasmus Lerdorf (Dec 16, 2013). "Re: Flexible function naming". Newsgroup: php.internals. Retrieved December 26, 2013..

   [15] ^"PHP — Acronym Meaning Vote". PHP.net. Archived from the original on August 15, 2000..

   [16] ^"Zend Engine version 2.0: Feature Overview and Design". Zend Technologies Ltd. Archived from the original on 2006-07-19. Retrieved 2006-09-17..

   [17] ^"php.net 2007 news archive". The PHP Group. 2007-07-13. Retrieved 2008-02-22..

   [18] ^Kerner, Sean Michael (2008-02-01). "PHP 4 is Dead—Long Live PHP 5". InternetNews. Archived from the original on 2018-08-06. Retrieved 2018-12-16..

   [19] ^Trachtenberg, Adam (2004-07-15). "Why PHP 5 Rocks!". O'Reilly. Retrieved 2008-02-22..

   [20] ^"Late Static Binding in PHP". Digital Sandwich. 2006-02-23. Retrieved 2008-03-25..

   [21] ^"Static Keyword". The PHP Group. Retrieved 2008-03-25..

   [22] ^"GoPHP5". Archived from the original on 2011-07-17..

   [23] ^GoPHP5. "PHP projects join forces to Go PHP 5" (PDF). GoPHP5 Press Release. Archived from the original (PDF) on 2009-12-10. Retrieved 2008-02-23..

   [24] ^"GoPHP5". GoPHP5. Archived from the original on 2011-04-27. Retrieved 2008-02-22..

   [25] ^"PHP Installation and Configuration". php.net. Retrieved 2013-10-29..

   [26] ^"PHP for Windows: Binaries and sources releases (5.3)". php.net. Retrieved 2013-10-29..

   [27] ^"PHP for Windows: Binaries and sources releases (5.4)". php.net. Retrieved 2013-10-29..

   [28] ^"PHP for Windows: Binaries and sources releases (5.5)". php.net. Retrieved 2013-10-29..

   [29] ^https://web.archive.org/web/20221025113450/http://php.net/supported-versions.php.

   [30] ^https://web.archive.org/web/20221025113450/https://wiki.debian.org/LTS/Jessie. [31] ^"Types: Strings (PHP Manual)". PHP.net. Retrieved 2013-09-22..

   [32] ^"Details of the String Type (PHP Manual)". PHP.net. Retrieved 2013-09-22..

   [33] ^Andrei Zmievski (2005-08-10). "PHP Unicode support design document" (Mailing list). Retrieved 2014-02-09..

   [34] ^"PHP 5.5 or 6.0". Retrieved 2014-02-09..

   [35] ^Rasmus Lerdorf (2010-03-11). "PHP 6" (Mailing list). Retrieved 2014-02-07..

   [36] ^"The Neverending Muppet Debate of PHP 6 v PHP 7"..

   [37] ^"RFC: Name of Next Release of PHP". php.net. 2014-07-07. Retrieved 2014-07-15..

   [38] ^"Re: [PHP-DEV] [VOTE][RFC] Name of Next Release of PHP (again)". 2014-07-30. Retrieved 2014-07-30..

   [39] ^"phpng: Refactored PHP Engine with Big Performance Improvement". news.php.net..

   [40] ^"PHP: rfc:phpng". php.net. Retrieved 16 December 2014..

   [41] ^"PHP: phpng". php.net. Retrieved 2014-07-15..

   [42] ^"Merge branch 'ZendEngine3'". github.com. 2014-12-05. Retrieved 2014-12-05..

   [43] ^"PHP: Release Process". 2011-06-20. Retrieved 2013-10-06..

   [44] ^"PHP RFC: Exceptions in the engine (for PHP 7)". php.net. Retrieved 2015-05-21..

   [45] ^"PHP RFC: Uniform Variable Syntax". php.net. 2014-05-31. Retrieved 2014-07-30..

   [46] ^"Online PHP shell | 150+ versions + stats + vld + hhvm"..

   [47] ^"PHP RFC: Fix "foreach" behavior". php.net. Retrieved 2015-05-21..

   [48] ^"PHP RFC: Constructor behaviour of internal classes". php.net. Retrieved 2015-05-21..

   [49] ^"PHP RFC: Removal of dead or not yet PHP7 ported SAPIs and extensions". php.net. Retrieved 2015-05-21..

   [50] ^"PHP RFC: Fix list() behavior inconsistency". php.net. Retrieved 2015-05-21..

   [51] ^"PHP RFC: Remove alternative PHP tags". php.net. Retrieved 2015-05-21..

   [52] ^"PHP RFC: Make defining multiple default cases in a switch a syntax error". php.net. Retrieved 2015-05-21..

   [53] ^"PHP RFC: Remove hex support in numeric strings". php.net. Retrieved 2015-05-21..

   [54] ^"PHP RFC: Integer Semantics". php.net. Retrieved 2015-05-21..

   [55] ^"PHP RFC: ZPP Failure on Overflow". php.net. Retrieved 2015-05-21..

   [56] ^"Unsupported Branches". php.net. Retrieved 2015-11-14..

   [57] ^"PHP: PHP 4 ChangeLog". The PHP Group. 2008-01-03. Retrieved 2008-02-22..

   [58] ^"Using PHP from the command line". PHP Manual. The PHP Group. Retrieved 2009-09-11..

   [59] ^"PHP 4.4.0 Release Announcement". PHP Mannual. The PHP Group. Retrieved 2013-11-24..

   [60] ^"PHP: PHP 5 ChangeLog". The PHP Group. 2007-11-08. Retrieved 2008-02-22..

   [61] ^"PHP manual: PDO". The PHP Group. 2011-11-15. Retrieved 2011-11-15..

   [62] ^"Built-in web server". Retrieved March 26, 2012..

   [63] ^"Supported Versions". php.net. Retrieved 2017-12-13..

   [64] ^"PHP 5.5.0 changes". php.net. Retrieved 2015-03-03..

   [65] ^"Migrating from PHP 5.5.x to PHP 5.6.x". php.net. Retrieved 2014-03-24..

   [66] ^"Resetting PHP 6". There have been books on the shelves purporting to cover PHP 6 since at least 2008. But, in March 2010, the PHP 6 release is not out — in fact, it is not even close to out. Recent events suggest that PHP 6 will not be released before 2011 — if, indeed, it is released at all..

   [67] ^"PHP 7 moves full speed ahead". Recent versions of PHP have been part of the 5.x release series, but there will be no PHP 6. "We're going to skip [version] 6, because years ago, we had plans for a 6, but those plans were very different from what we're doing now," Gutmans said. Going right to version 7 avoids confusion..

   [68] ^"News Archive – 2018: PHP 7.2.9 Released". php.net. 2018-08-16. Retrieved 2018-08-16..

   [69] ^"PHP: rfc:size_t_and_int64_next". php.net. Retrieved 16 December 2014..

   [70] ^"PHP: rfc:abstract_syntax_tree". php.net. Retrieved 16 December 2014..

   [71] ^"PHP: rfc:closure_apply". php.net. Retrieved 16 December 2014..

   [72] ^"PHP: rfc:integer_semantics". php.net. Retrieved 16 December 2014..

   [73] ^"PHP: rfc:isset_ternary". php.net. Retrieved 16 December 2014..

   [74] ^"RFC: Unicode Codepoint Escape Syntax". 2014-11-24. Retrieved 2014-12-19..

   [75] ^"Combined Comparison (Spaceship) Operator". php.net. Retrieved 2015-05-21..

   [76] ^"PHP RFC: Generator Delegation". php.net. Retrieved 2015-05-21..

   [77] ^"PHP RFC: Anonymous Classes". php.net. Retrieved 2015-05-21..

   [78] ^"PHP RFC: Easy User-land CSPRNG". php.net. Retrieved 2015-05-21..

   [79] ^"PHP RFC: Group Use Declarations". php.net. Retrieved 2015-05-21..

   [80] ^"PHP: rfc:class_constant_visibility". php.net. 2015-10-27. Retrieved 2015-12-08..

   [81] ^"PHP: rfc:void_return_type". php.net. 2015-11-09. Retrieved 2015-11-14..

   [82] ^"PHP: rfc:object-typehint". wiki.php.net..

   [83] ^"PHP: rfc:libsodium". wiki.php.net..

   [84] ^"PHP: rfc:allow-abstract-function-override". wiki.php.net..

   [85] ^"PHP: rfc:parameter-no-type-variance". wiki.php.net..

   [86] ^"PHP: todo:php73". wiki.php.net..

   [87] ^"PHP: rfc:flexible_heredoc_nowdoc_syntaxes". wiki.php.net..

   [88] ^"PHP: rfc:list_reference_assignment". wiki.php.net..

   [89] ^"PHP: rfc:pcre2-migration". wiki.php.net..

   [90] ^"PHP: hrtime - Manual". php.net..

   [91] ^"PHP 7.4 Preparation Tasks". php.net..

   [92] ^"PHP: rfc:typed_properties_v2". wiki.php.net. Retrieved 2019-04-04..

   [93] ^"PHP: rfc:preload". wiki.php.net. Retrieved 2019-04-04..

   [94] ^"PHP: rfc:null_coalesce_equal_operator". wiki.php.net. Retrieved 2019-04-04..

   [95] ^"PHP: rfc:improve-openssl-random-pseudo-bytes". wiki.php.net. Retrieved 2019-04-04..

   [96] ^"PHP: rfc:weakrefs". wiki.php.net. Retrieved 2019-04-05..

   [97] ^"PHP: rfc:ffi". wiki.php.net. Retrieved 2019-04-05..

   [98] ^"PHP: rfc:permanent_hash_ext". wiki.php.net. Retrieved 2019-04-05..

   [99] ^"PHP: rfc:password_registry". wiki.php.net. Retrieved 2019-04-05..

   [100] ^"PHP: rfc:mb_str_split". wiki.php.net. Retrieved 2019-04-05..

   [101] ^"PHP: rfc:reference_reflection". wiki.php.net. Retrieved 2019-04-05..

   [102] ^"PHP: rfc:deprecate-and-remove-ext-wddx". wiki.php.net. Retrieved 2019-04-05..

   [103] ^"PHP: rfc:custom_object_serialization". wiki.php.net. Retrieved 2019-04-05..

   [104] ^"PHP: rfc:jit". wiki.php.net. Retrieved 2019-04-05..

   [105] ^"PHP: rfc:negative_array_index". wiki.php.net. Retrieved 2019-04-05..

   [106] ^"PHP: rfc:consistent_type_errors". wiki.php.net. Retrieved 2019-04-05..

   [107] ^"PHP: rfc:lsp_errors". wiki.php.net. Retrieved 2019-05-26..

   [108] ^"PHP: ElePHPant". 4 Oct 2014. Retrieved 4 Oct 2014..

   [109] ^"Redirecting…". wwphp-fb.github.io..

   [110] ^"The PHP Mascot's Birth - Creator Of The elePHPant Vincent Pontier Reveals The True Story!". 7php.com..

   [111] ^"PHP: ElePHPant"..

   [112] ^"tags — Manual". php.net. Retrieved 2014-02-17..

   [113] ^"PHP: rfc:shortags". php.net. 2008-04-03. Retrieved 2014-05-08..

   [114] ^"PHP: Basic syntax". The PHP Group. Retrieved 2008-02-22..

   [115] ^"Basic Coding Standard". PHP Framework Interoperability Group. Retrieved 2016-01-03..

   [116] ^"echo — Manual". php.net. Retrieved 2014-02-17..

   [117] ^"Description of core php.ini directives — Manual". php.net. 2002-03-17. Retrieved 2014-02-17..

   [118] ^"Your first PHP-enabled page". The PHP Group. Retrieved 2008-02-25..

   [119] ^Bray, Tim; et al. (26 November 2008). "Processing Instructions". Extensible Markup Language (XML) 1.0 (Fifth Edition). W3C. Retrieved 2009-06-18..

   [120] ^"RFC: Scalar Type Declarations". php.net. 2015-03-16. Retrieved 2015-03-17..

   [121] ^"Instruction separation". The PHP Group. Retrieved 2008-03-16..

   [122] ^"Comments". The PHP Group. Retrieved 2008-03-16..

   [123] ^"Integers in PHP, running with scissors, and portability". MySQL Performance Blog. March 27, 2007. Retrieved 2007-03-28..

   [124] ^"Types". The PHP Group. Retrieved 2008-03-16..

   [125] ^"Strings". The PHP Group. Retrieved 2008-03-21..

   [126] ^"SPL – StandardPHPLibrary". PHP.net. March 16, 2009. Retrieved 2009-03-16..

   [127] ^"User-defined functions (PHP manual)". php.net. 2014-07-04. Retrieved 2014-07-07..

   [128] ^"Variable functions (PHP manual)". php.net. 2014-07-04. Retrieved 2014-07-07..

   [129] ^"create_function() (PHP manual)". php.net. 2014-07-04. Retrieved 2014-07-07..

   [130] ^Christian Seiler; Dmitry Stogov (2008-07-01). "Request for Comments: Lambda functions and closures". php.net. Retrieved 2014-07-07..

   [131] ^"History of PHP and related projects". The PHP Group. Retrieved 2008-02-25..

   [132] ^"Classes and Objects (PHP 5)". The PHP Group. Retrieved 2008-03-16..

   [133] ^"Object cloning". The PHP Group. Retrieved 2008-03-16..

   [134] ^"Visibility (PHP Manual)". theserverpages.com. 2005-05-19. Retrieved 2010-08-26..

   [135] ^"How do computer languages work?". Retrieved 2009-11-04..

   [136] ^Gilmore, W. Jason (2006-01-23). Beginning PHP and MySQL 5: From Novice to Professional. Apress. p. 43. ISBN 1590595521..

   [137] ^"[VOTE] Integrating Zend Optimizer+ into the PHP distribution". news.php.net. Retrieved 2013-03-08..

   [138] ^"Alternative PHP Cache". PHP.net. Retrieved 2013-09-21..

   [139] ^"We are the 98.5% (and the 16%) « HipHop Virtual Machine". hhvm.com. December 2013. Retrieved 2014-02-23.. [140] ^"The Definitive PHP 5.6, 7.0, 7.1, 7.2 & 7.3 Benchmarks (2019)" (in 英语). 2019-01-14. Retrieved 2019-04-19..

   [141] ^Krill, Paul (2017-09-20). "Forget PHP! Facebook's HHVM engine switches to Hack instead". InfoWorld (in 英语). Retrieved 2019-02-06..

   [142] ^"Announcement on GitHub removing HPHPc support". Retrieved 2013-05-24..

   [143] ^"The PHP License, version 3.01". Retrieved 2010-05-20..

   [144] ^"GPL-Incompatible, Free Software Licenses". Various Licenses and Comments about Them. Free Software Foundation. Retrieved 2011-01-03..

   [145] ^"PHP: Function and Method listing — Manual". The PHP Group. Retrieved 2015-01-14..

   [146] ^"Introduction — Manual". php.net. 2013-06-07. Retrieved 2013-06-13..

   [147] ^Darryl Patterson (5 August 2004). "Simplify Business Logic with PHP DataObjects — O'Reilly Media". ibm.com. Retrieved 16 December 2014..

   [148] ^"IBM — United States". IBM — United States. Retrieved 16 December 2014..

   [149] ^"Five common PHP database problems". ibm.com. 2006-08-01. Retrieved 2013-06-13..

   [150] ^"IBM Redbooks — Developing PHP Applications for IBM Data Servers". redbooks.ibm.com. Retrieved 16 December 2014..

   [151] ^"php[architect] Magazine - The Journal for PHP Programmers". www.phparch.com..

   [152] ^Krill, Paul (19 October 2005). "PHP catching on at enterprises, vying with Java". InfoWorld. Archived from the original on 13 July 2014..

   [153] ^"Cross Reference: /PHP_5_4/ext/standard/". php.net. Archived from the original on 16 March 2012. Retrieved 16 December 2014..

   [154] ^"Developing Custom PHP Extensions". devnewz.com. 2002-09-09. Archived from the original on 2008-02-18. Retrieved 2008-02-25..

   [155] ^"Why Zephir?". zephir-lang.com. 2015-10-20. Retrieved 2015-12-14..

   [156] ^"PHP Credits". Retrieved 2018-12-16..

   [157] ^"General Installation Considerations". php.net. Retrieved 2013-09-22..

   [158] ^"News Archive: PHP 5.3.3 Released!". php.net. 2010-07-22..

   [159] ^"FastCGI Process Manager (FPM)". php.net. Retrieved 2013-09-22..

   [160] ^"Command line usage: Introduction". php.net. Retrieved 2013-09-22..

   [161] ^"Command line usage: Differences to other SAPIs". php.net. Retrieved 2013-09-22.. [162] ^"PHP: Apache 2.x on Microsoft Windows". php.net. Archived from the original on 2013-09-26. Retrieved 2013-09-22..

   [163] ^"Installing PHP-GTK 2". php.net. Retrieved 2013-09-22..

   [164] ^"AWS SDK for PHP". aws.amazon.com. Retrieved 2014-03-06..

   [165] ^"Windows Azure SDK for PHP — Interoperability Bridges and Labs Center". interoperabilitybridges.com. Archived from the original on 2014-03-20. Retrieved 2014-03-06..

   [166] ^"Runtime configuration: Table of contents". php.net. Retrieved 2013-09-22..

   [167] ^"php.ini directives: List of php.ini directives". php.net. Retrieved 2013-09-22..

   [168] ^"Runtime configuration: The configuration file". PHP.net. Retrieved 2013-09-22..

   [169] ^"php.ini directives: List of php.ini sections". PHP.net. Retrieved 2013-09-22..

   [170] ^"Runtime configuration: Where a configuration setting may be set". PHP.net. Retrieved 2013-09-22..

   [171] ^"PHP Manual Image Processing and GD;". php.net. Retrieved 2011-04-09..

   [172] ^"Embedding PHP in HTML". O'Reilly. 2001-05-03. Retrieved 2008-02-25..

   [173] ^"PHP Server-Side Scripting Language". Indiana University. 2007-04-04. Retrieved 2008-02-25..

   [174] ^"JavaServer Pages Technology — JavaServer Pages Comparing Methods for Server-Side Dynamic Content White Paper". Sun Microsystems. Retrieved 2008-02-25..

   [175] ^"Five simple ways to tune your LAMP application"..

   [176] ^"PHP: PHP Usage Stats". SecuritySpace. 2007-04-01. Retrieved 2008-02-24..

   [177] ^"Manual:Installation requirements#PHP". MediaWiki. 2010-01-25. Retrieved 2010-02-26. PHP is the programming language in which MediaWiki is written [...].

   [178] ^Kempkens, Alex. "Joomla! — Content Management System to build websites & apps"..

   [179] ^"Server requirements of SilverStripe". Retrieved 13 October 2014. SilverStripe requires PHP 5.3.2+.

   [180] ^"About WordPress". Retrieved 2010-02-26. WordPress was [...] built on PHP.

   [181] ^"PHP and Drupal". Drupal.org. Retrieved 2010-06-13..

   [182] ^"About". Moodle.org. Retrieved 2009-12-20..

   [183] ^"PHP and Facebook | Facebook". Blog.facebook.com. Retrieved 2009-07-29..

   [184] ^"PHP and Digg". O'Reilly. Retrieved 2010-06-13..

   [185] ^"PHP 7 at Tumblr". Tumblr Engineering. 4 November 2016..

   [186] ^"PHP 7 deployment at Dailymotion". Dailymotion engineering blog. 3 October 2016..

   [187] ^"Taking PHP Seriously". Slack Engineering Blog. 12 October 2016..

   [188] ^"PHP at the core: Extension structure". PHP.net. Retrieved 2013-09-22..

   [189] ^"PHP at the core: The "counter" Extension – A Continuing Example". PHP.net. Retrieved 2013-09-22..

   [190] ^"Extension Writing Part I: Introduction to PHP and Zend". Zend Technologies. 2005-03-01. Retrieved 2013-09-22..

   [191] ^"Extension Writing Part II: Parameters, Arrays, and ZVALs". Zend Technologies. 2005-06-06. Retrieved 2013-09-22..

   [192] ^"Extension Writing Part II: Parameters, Arrays, and ZVALs (continued)". Zend Technologies. 2005-06-06. Retrieved 2013-09-22..

   [193] ^"Extension Writing Part III: Resources". Zend Technologies. 2006-05-12. Retrieved 2013-09-22..

   [194] ^"Wrapping C++ Classes in a PHP Extension". Zend Technologies. 2009-04-22. Retrieved 2013-09-22..

   [195] ^"Extending PHP with C++?". Stack Overflow. Retrieved 2013-09-22..

   [196] ^"How can I use C++ code to interact with PHP?". Stack Overflow. Retrieved 2013-09-22..

   [197] ^Golemon, Sara (2006). Extending and Embedding PHP. ISBN 978-0-672-32704-9..

   [198] ^"Bug Request #46919: Multi threading". PHP.net. Retrieved 2013-09-22..

   [199] ^"pthreads: Introduction (PHP Manual)". PHP.net. Retrieved 2013-09-22..

   [200] ^"PECL :: Package :: pthreads". pecl.php.net. Retrieved 2014-02-09..

   [201] ^Ide, Andy (2013-01-31). "PHP just grows & grows". Retrieved 2013-04-01..

   [202] ^"National Vulnerability Database (NVD) Search Vulnerabilities". Retrieved 2014-03-19.[永久失效连结].

   [203] ^"PHP-related vulnerabilities on the National Vulnerability Database". 2012-07-05. Retrieved 2013-04-01..

   [204] ^"PHP Taint Mode RFC"..

   [205] ^"Developer Meeting Notes, Nov. 2005"..

   [206] ^"Taint mode decision, November 2007". Archived from the original on 2009-02-26..

   [207] ^"Hardened-PHP Project". 2008-08-15..

   [208] ^"Security: Using Register Globals". PHP Manual. PHP.net. Retrieved 2013-09-22..

   [209] ^"Magic Quotes". PHP Manual. PHP.net. Retrieved 2014-01-17..

   [210] ^"'engine' configuration directive". PHP: Runtime Configuration. PHP.net. Retrieved 2014-02-13..

   [211] ^"PHP Security Exploit With GIF Images". 2007-06-22. Retrieved 2013-09-22..

   [212] ^"PHP security exploit with GIF images". PHP Classes blog. 2007-06-20. Retrieved 2013-09-22..

   [213] ^"Passing Malicious PHP Through getimagesize()". 2007-06-04. Archived from the original on 2013-09-21. Retrieved 2013-09-22..

   [214] ^"'enable_dl' configuration directive". PHP: Runtime Configuration. PHP.net. Retrieved 2014-02-13..

   [215] ^"PHP function reference: dl()". PHP.net. Retrieved 2013-09-22..

   [216] ^Raz0r. "Simple Machines Forum <= 2.0.3 Admin Password Reset"..

   [217] ^Nibble Security. "TYPO3-SA-2010-020, TYPO3-SA-2010-022 EXPLAINED"..

   [218] ^Ahack.ru. "Криптостойкость и небезопасное сравнение"..

   [219] ^"Comparison operators". PHP.net..

   [220] ^Pawel Krawczyk (2013). "Most common attacks on web applications". IPSec.pl. Retrieved 2015-04-15..

   [221] ^Pawel Krawczyk (2013). "So what are the "most critical" application flaws? On new OWASP Top 10". IPSec.pl. Retrieved 2015-04-15..


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利