日期:2014-05-17  浏览次数:20475 次

PHP5.4最新特性

官网:ChangeLog-5.php#5.4.0

原文Oracle:LAMP 体系有了新的竞争,但此版本中的特性使 PHP 再次挑战极限。 稍微做了修改。

概述总结:
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_compat42、session.bug_compat_warn 以及 y2k_compliance。
2)不再支持PHP 中的 break 和continue 后带变量语法
3)mysqlnd 这一捆绑的 MySQL 原生驱动程序库现在默认用于与 MySQL 通信的各种扩展,除非在编译时通过 ./configure 被显式覆盖。


       大约八年前,我为 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 提供了一组更丰富的选择。

       出现了多种有趣的技术,因而我们编写了 PHP 扩展来轻松访问这些技术。我最喜爱的一个扩展是 libevent,可以用它在 PHP 中编写事件驱动的高性能应用程序。另一个是 ZeroMQ,这是一个高级套接字库。与 SQLite 不再需要编写另一种原始文件格式和关联的分析器极为相似,ZeroMQ 也无需因任何理由而使用套接字协议和关联的套接字处理代码。您甚至可以组合使用 libevent 和 ZeroMQ,以获得独立、高性能、事件驱动的卓越服务器。(如果您对此感兴趣,请参见此示例。)我还十分喜欢SVM(支持向量机)这一机器学习算法,您不必成为机器学习的爱好者也可提出许多问题。

       还有许多扩展在最近几年内已被广泛接受。特别是,Gearman 变得流行起来,逐渐成为用户部署的常见体系的一部分。您可以通过 Gearman 分派作业,以便由工作器异步完成这些作业。工作器可以遍布多台服务器,它们甚至可以进一步分派更多的 MapReduce 类型作业。

       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 相关的问题都有解决方案,只是未明确集成到语言本身中。

         这样在 2012 年推出 PHP 5.4。而且,与上一版本时隔将近 3 年,我们在此期间对一些内容进行了改进。我宁愿恢复到每年推出一个版本,每个版本包含更少的新特性。

以下是您升级到 5.4 时将看到的主要特性:

1. 内存和性能改进

       许多内部结构已变得更小或完全消失,从而在大型 PHP 应用程序中可节省 20-50% 的内存。通过各种优化使性能提高 10-30%(主要取决于代码执行的操作),这些优化包括内联各种常见代码路径、将 $GLOBALS 添加到 JIT、“@”操作符运算更快、添加了运行时类/函数/常量缓存、运行时字符串常量现在被拘留、通过预先计算的散列更快地访问常量、空数组速度更快并使用更少内存、unserialize() 和 FastCGI 请求处理速度更快,以及在整个代码中进行更多的内存和性能调整。

例如,早期的一些测试表明,Zend Framework 在 5.4 中运行速度提高 21% 并且内存使用减少 23%,而 Drupal 内存使用减少 50% 并且运行速度大约提高 7%。

2. 支持特性Trait

        Trait 可能是 PHP 5.4 中谈论最多的特性 — 将它们视为编译器辅助的复制粘贴。Trait 也是 Scala 的一个特性。其他语言可能将它们称为“mixin”— 或者这些语言根本不对它们进行命名,但具有扩展接口机制,允许接口包含其方法的实际实现。

与 mixin 相反,PHP 中的 trait 包括显式冲突解决机制,用于多个 trait 实现相同方法的情况。

trait Singleton {
    public static function getInstance() { ... }
}

class A {
    use Singleton;
    // ...
}

class B extends ArrayObject {
    use Singleton;
    // ...
}

// Singleton method is now available for both classes
A::getInstance();
B: