原文Oracle:LAMP 体系有了新的竞争,但此版本中的特性使 PHP 再次挑战极限。 稍微作了修改。:css
概述总结:
1. 内存和性能改进:大型 PHP 应用程序中可节省 20-50% 的内存。经过各类优化使性能提升 10-30%
2. 支持特性Trait
3. 精简数组语法,能够定义短数组
4. 函数数组解除引用,支持Array dereferencing,
5. 实例方法调用
6. 闭包绑定
7. 对象即函数
8. 内置 Web 服务器 (CLI)
9. 原生会话处理程序接口
10. JsonSerializable 接口
11. 二进制表示法
12. 改进了错误消息
13. 数组到字符串转换通知
14. 函数类型提示的加强,(Callable typehint)
15. 对时间统计的加强,高精度计时器
16. 上传进度条Upload progress
17. Zend Signal in PHP 5.4
18. PHP 5.4 由Arnaud 引入了一个对三元式的优化方案.
1)弃用: allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat4二、session.bug_compat_warn 以及 y2k_compliance。
2)再也不支持PHP 中的 break 和continue 后带变量语法
3)mysqlnd 这一捆绑的 MySQL 原生驱动程序库如今默认用于与 MySQL 通讯的各类扩展,除非在编译时经过 ./configure 被显式覆盖。html
大约八年前,我为 Oracle 技术网写了一篇名为“您了解 PHP 吗?”的文章。在那篇文章中,我谈到了 PHP 执拗的功能优于形式的“Web 问题”解决方法,以及它所具有的让事情变得简单的能力。当时,咱们即将发布 PHP 5.0。如今,时隔将近十年以后咱们推出全新的 PHP 5.4.0 版本,虽然在这期间发生了不少事情,但也有许多事情根本没变。前端
没变的一件事情就是生态系统一如以往那样重要。解决 Web 问题不只仅关乎脚本语言的选择,它关乎的是周围的整个生态系统。如今,LAMP 体系已盛行近 15 年,仍广受欢迎,但咱们开始注意到其余功能强大的方案。附带 nginx 的 PHP-FPM 已经快速流行起来,由于从 PHP 5.3 开始大大改进了支持,并在 5.4 中进一步获得简化。体系中的 M(即数据库)部分与 8 年前相比也开始变得极为不一样。与将全部内容都只放入 MyISAM 表中相比,各类 NoSQL 解决方案和 MySQL Cluster 提供了一组更丰富的选择。mysql
出现了多种有趣的技术,于是咱们编写了 PHP 扩展来轻松访问这些技术。我最喜好的一个扩展是 libevent,能够用它在 PHP 中编写事件驱动的高性能应用程序。另外一个是ZeroMQ,这是一个高级套接字库。与 SQLite 再也不须要编写另外一种原始文件格式和关联的分析器极为类似,ZeroMQ 也无需因任何理由而使用套接字协议和关联的套接字处理代码。您甚至能够组合使用 libevent 和 ZeroMQ,以得到独立、高性能、事件驱动的卓越服务器。(若是您对此感兴趣,请参见此示例。)我还十分喜欢SVM(支持向量机)这一机器学习算法,您没必要成为机器学习的爱好者也可提出许多问题。nginx
还有许多扩展在最近几年内已被普遍接受。特别是,Gearman 变得流行起来,逐渐成为用户部署的常见体系的一部分。您能够经过 Gearman 分派做业,以便由工做器异步完成这些做业。工做器能够遍及多台服务器,它们甚至能够进一步分派更多的 MapReduce 类型做业。web
2004 年发布 PHP 5.0 以后,接下来在 2005 年推出 5.1,此版本新增了 DateTime 实现、PDO 和性能改进。PHP 5.2 于 2006 年发布,引入了改进的内存管理器、JSON 支持和输入筛选。当时,咱们着手推进 PHP 6,这是一个极其宏伟的计划,彻底重写有关 ICU(Unicode 国际化组件)库的全部内容。事实证实这个计划有些操之过急 — 咱们没法使足够多的开发人员为之兴奋,最终只得将准备引入 PHP 6 的各类特性添加到 2009 年发布的 PHP 5.3 中。5.2 与 5.3 版本时隔 3 年,这也意味着 5.3 向 PHP 新增了大量内容:命名空间、后期静态绑定、闭包、垃圾收集、受限 goto、mysqlnd(MySQL 原生驱动程序)、更好的 Windows 性能以及许多其余内容。算法
过后看来,将此版本称为 PHP 6 可能有必定的道理,但 PHP 6 等同于在 Unicode 方面所作的努力,以致于为此编写了相关书籍,所以咱们认为若是没有对 Unicode 作出重大改进,就不能发布 PHP 6。咱们引入了名为“intl”的 ICU 扩展,它也针对 PHP 5.2 编译,这可以让您访问更多的 ICU 功能。mbstring 扩展随时间不断地改进,这意味着几乎任何与 Unicode 相关的问题都有解决方案,只是未明确集成到语言自己中。sql
这样在 2012 年推出 PHP 5.4。并且,与上一版本时隔将近 3 年,咱们在此期间对一些内容进行了改进。我宁愿恢复到每一年推出一个版本,每一个版本包含更少的新特性。数据库
如下是您升级到 5.4 时将看到的主要特性:
许多内部结构已变得更小或彻底消失,从而在大型 PHP 应用程序中可节省 20-50% 的内存。经过各类优化使性能提升 10-30%(主要取决于代码执行的操做),这些优化包括内联各类常见代码路径、将 $GLOBALS 添加到 JIT、“@”操做符运算更快、添加了运行时类/函数/常量缓存、运行时字符串常量如今被拘留、经过预先计算的散列更快地访问常量、空数组速度更快并使用更少内存、unserialize() 和 FastCGI 请求处理速度更快,以及在整个代码中进行更多的内存和性能调整。
例如,早期的一些测试代表,Zend Framework 在 5.4 中运行速度提升 21% 而且内存使用减小 23%,而 Drupal 内存使用减小 50% 而且运行速度大约提升 7%。
Trait 多是 PHP 5.4 中谈论最多的特性 — 将它们视为编译器辅助的复制粘贴。Trait 也是 Scala 的一个特性。其余语言可能将它们称为“mixin”— 或者这些语言根本不对它们进行命名,但具备扩展接口机制,容许接口包含其方法的实际实现。
与 mixin 相反,PHP 中的 trait 包括显式冲突解决机制,用于多个 trait 实现相同方法的状况。
请参见 php.net/traits 了解更多示例,包括冲突解决语法、方法优先顺序、可见性以及对 trait 中常量和属性的支持。此外,要详细了解概念理论,您能够阅读 Nathan Schärli 的论文“Trait:行为构建块中的组合类”。
新增的一种简单但很是流行的语法:
就是说,您如今再也不须要使用“array”关键字来定义数组。
1)新增的另外一种经常使用语法。返回数组的函数调用如今能够直接解除引用:
2)有了Array dereferencing, 之前的这种写法就不再必要了:
与函数数组解除引用相关,您如今能够调用对象实例化方法。与早期版本同样,您固然仍能够连接方法调用,所以您如今能够编写以下代码:
然而,因为可能丢弃实例化的对象,所以,除非您的构造函数执行有用操做,不然您应该在此改用静态方法调用。若是将它与精简数组语法和函数数组解除引用结合使用,咱们能够编写某些十分复杂的代码:
看一眼以后,您能够判定输出是什么吗?在此,咱们将二维数组传递到仅返回数组的构造函数。而后,咱们选出第二个维度的第一个元素,所以这将输出“4”。
闭包是在 PHP 5.3 中引入的,但在 5.4 中咱们改进了闭包与对象的交互方式。例如:
注意闭包访问 $this->prop 这一私有属性。默认状况下,PHP 中的闭包使用预绑定 — 这意味着闭包内的变量具备定义闭包时所具备的值。可使用引用将其转换为后绑定。可是,也能够从新绑定闭包:
在此,咱们将闭包从 $a 实例从新绑定到 $b 中的实例。若是您不但愿闭包随时访问对象实例,能够将闭包声明为静态:
有一种新的神奇方法,名为“__invoke”,其用法以下:
CLI 服务器是一种小型 Web 服务器实现,能够从命令行运行:
CLI 服务器不适合用做生产 Web 服务器;咱们将使用它运行一些 PHP 回归测试,其余单元测试机制也可以使用它,而且 IDE 也可能使用它。它确实具备一些颇有用的特性,用于从命令行进行平常代码调试。默认状况下,它使用当前目录做为 DocumentRoot;它也处理静态文件请求。默认目录索引文件为“index.php”,所以您能够在满含 .php、.css、.jpg 等文件的目录中激活它,它本身就能够运行。对于可能使用 mod_rewrite 将全部请求发送到前端控制器或路由器的更复杂应用程序,您能够将此路由器与一个简单的小脚本包装在一块儿,并启动 CLI 服务器,以下所示:
router.php 脚本可能以下所示:
此包装器加载直接 .php 请求,将包含“.”的任何其余请求传递到静态文件处理程序,其余全部内容都传递到框架的路由器。您能够如此直接从命令行运行 Drupal 和 Symphony。
这是一个小而方便的特性,如今能够用它实现会话处理程序接口。如今,您能够仅将会话处理对象的实例传递给 session_set_save_handler(),而没必要传递给它六个比较麻烦的函数:
如今,您能够经过实现 JsonSerializable 接口来控制有人尝试使用 json_encode() 对您的对象进行编码时所发生的状况:
为了与 PHP 的原生十六进制和八进制支持协调一致,如今也支持二进制表示法:采用“0b”前缀标识二进制数
$mask = 0b010101;
错误消息稍有改进。
改进前:
改进后:
改进可能不十分明显,但区别是如今已在错误消息中显示偏移标记“foo”的值。
若是您一直使用 PHP,则可能以随机出如今页面中“Array”一词结束编程,由于您尝试直接输出数组。每当将数组直接转换为字符串时,都颇有可能出现错误,如今有了一个针对这一状况的通知:
注意:数组到字符串转换在 example.php onlLine 2 中
14. 函数类型提示的加强,(Callable typehint)
因为php是弱类型的语言,所以在php 5.0后,引入了函数类型提示的功能,支持对象和数组,其含义为对于传入函数中的参数都进行类型检查,举个例子,有以下的类:
这次引入了$_SERVER['REQUEST_TIME_FLOAT']数组变量,微秒级精度(百万分之一秒,float类型)。对于统计脚本运行时间会很是有用:
echo 'Executed in ', round(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT'], 2)
16. 上传进度条Upload progress
文件上传进度反馈, 这个需求在当前是愈来愈广泛, 好比大附件邮件. 在PHP5.4之前, 咱们能够经过APC提供的功能来实现. 或者使用PECL扩展uploadprogress来实现.
虽说, 它们能很好的解决如今的问题, 可是也有很明显的不足:
从PHP的角度来讲, 最好的储存这些信息的地方应该是SESSION, 首先它是PHP原生支持的机制. 其次, 它能够被配置到存放到任何地方(支持多机共享).
正由于此, Arnaud Le Blanc提出了针对Session报告上传进度的RFC, 而且如今实现也已经包含在了PHP5.4的主干中。
经过$_SESSION["upload_progress_name"]就能够得到当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。
在PHP5.4中, 根据由Rasmus提交的RFC, 引入了一套新的信号处理机制, 目的是为了使得信号屏蔽机制能够应用到任何SAPI中, 而且提升在这个过程当中的PHP性能.
新的机制, 叫作zend signal, 它的理念, 来自Yahoo的”延迟信号处理”(Yahoo signal deferring mechanism), 然后, facebook把这套理念加入了PHP中, 为了提高PHP+Apache 1.X下PHP调用ap_block/ap_unblock的性能.
18. PHP 5.4 由Arnaud 引入了一个对三元式的优化方案.
咱们都知道PHP用写时复制来对变量复制作性能优化, 而在之前的三元式中, 却每次都会复制, 这在操做数是大数组的状况下, 会形成性能问题:
1)最后,咱们集中整理了几年来标记为已弃用的多个特性。这些特性包括 allow_call_time_pass_reference、define_syslog_variables、highlight.bg、register_globals、register_long_arrays、magic_quotes、safe_mode、zend.ze1_compatibility_mode、session.bug_compat4二、session.bug_compat_warn 以及 y2k_compliance。
2) 备受指责的 Register Globals 已从 PHP 中彻底删除。十年来,该特性一直以其频繁发生的安全漏洞而著称。2002年该特性被设置为默认关闭。2009年发布的 PHP5.3 将该特性标记为“弃用”,想必从那时起,大部分开发人员已经再也不使用它。
3)除了这些特性以外,magic_quotes 多是最大的危险。在早期版本中,未考虑因 magic_quotes 出错致使的后果,简单编写且未采起任何举措使自身免受 SQL 注入攻击的应用程序都经过 magic_quotes 来保护。若是在升级到 PHP 5.4 时未验证已采起正确的 SQLi 保护措施,则可能致使安全漏洞。
4)PHP 中的 break 和continue 语句以后能够跟上一个参数用来指明跳出的循环层数。若是不指定参数,它会像 VB、C#或 Java 同样跳出最内层的循环。在 PHP 5.4 以前,开发人员能够向 break 语句传递一个变量,而如今只能传递常量。
5)PHP 容许参数按引用传递。在早期版本中,你能够经过为调用点添加修饰来指明变量按引用传递。在 PHP 5.4 中,该选项已被移除。相反,现代 PHP 编程只须要在函数声明时指定按引用传递便可。与 C# 不一样,你不须要同时在声明和调用点指定按引用传递。
有一种新的“可调用的”类型提示,用于某方法采用回调做为参数的状况。
htmlspecialchars() 和 htmlentities() 如今可更好地支持亚洲字符,若是未在 php.ini 文件中显式设置 PHP default_charset,这两个函数默认使用 UTF-8 而不是 ISO-8859-1。
<?=(精简回显语法)如今始终可用,不管 short_tags ini 设置的值为什么。这应该使模板化系统建立者感到满意。
会话 ID 如今默认经过 /dev/urandom(或等效文件)中的熵生成,而不是与早期版本同样成为必须显式启用的一个选项。
mysqlnd 这一捆绑的 MySQL 原生驱动程序库如今默认用于与 MySQL 通讯的各类扩展,除非在编译时经过 ./configure 被显式覆盖。
可能还有 100 个小的改动和特性。从 PHP 5.3 升级到 5.4 应该极为顺畅,但请阅读迁移指南加以确保。若是您从早期版本升级,执行的操做可能稍多一些。请查看之前的迁移指南再开始升级。
咱们没有对 PHP 进行长期规划。PHP 将随 Web 一块儿发展。咱们不知道 5-10 年内的重要 Web 趋势和技术将是什么,但知道经过咱们的不断付出,PHP 必将存在。
短时间内,咱们经过“internals”邮件列表讨论 PHP 开发,而且就大特性达成共识时,它将发展为 RFC。您能够在wiki.php.net/rfc 中找到 RFC。一旦咱们表决赞成发布一组极佳的新特性,而且对这些特性进行了正确实现和测试,咱们便开始筹备推出新版本。
PHP 随 Web 发展并保持稳定的市场份额,在全球全部网站中,大约三分之一的网站都使用它。其中不只包括一些最大的网站,并且还包括很大一部分最小的网站。我是在最小网站上单独设置 PHP 的:扩展是天然而然的事情,甚至是预期的特征,也是强烈吸引工程师的特征,但缩减不太正常,而且在某些状况下更困难。若是您找到适当的平衡,而且能够将同一代码库用于宿舍出租乃至拥有数十亿美圆资产的公司,那么您就真正掌握了这种语言。
PHP 5.4版本将是最后一个支持Windows XP 和 Windows 2003的版本,从此将再也不提供针对这些操做系统的二进制包。