本系列着重介绍 PHP V5.3 中的新特性,例如名称空间、闭包、对象管理、面向对象编程和 Phar。虽然这些动人的新特性作为该语言的增补广受欢迎,但 PHP V5.3 同时也是为进一步优化 PHP 而设计的。它构建在流行、稳定的 PHP V5.2 的基础上,并对该语言作了增强,使之更加强大。在本文中,了解 PHP V5.3 中的变化,以及从 PHP V5.2 升级到 PHP V5.3 时需要考虑的一些事情。
该语言新增了名称空间和闭包(在 第 2 部分 和 第 3 部分 中有讨论到),增加了更多的保留字。从 PHP V5.3 开始,namespace
不再用作标识符。closure
类现在是一个保留类,但它仍然可以作为有效的标识符。清单 1 显示了一些例子,由于新增的保留字的缘故,有些语句在 PHP V5.3 中不再有效。
// the function definition below will throw a fatal error in PHP 5.3, but is perfectly // valid in 5.2 function namespace() { .... } // same with this class definition class Closure { .... } |
PHP V5.3 中还增加了对 goto
语句的支持。现在,goto
是一个保留字。goto
语句在现代语言中不太常见(您也许记得在 BASIC 中如何使用 goto),但是有些情况下,goto 语句的确方便。清单 2 显示了一个如何使用 goto 语句的例子。
echo "This text will get outputted"; goto a; echo "This text will get skipped"; a: echo "This text will get outputted"; |
goto
的一个可能的用例是中断深度嵌套的循环和 if
语句。这将使代码阅读起来清晰很多。
在 PHP V5.3 中,函数和方法没有大的变化,但还是有一些增强,以帮助解决 PHP 中的一些突出问题并提高性能。本节讨论一些较为显著的变化。
在之前版本的 PHP 中,数组函数 atsort
、natcasesort
、usort
、uasort
、uksort
、array_flip
和 array_unique
可以以参数形式传递对象而不是数组。然后,这些函数将对象的属性当做数组的键和值。PHP V5.3 中不再支持这一点,所以需要首先将对象转换成数组。清单 3 展示了如何修改代码。
$obj = new stdClass; $obj->a = '1'; $obj->b = '2'; $obj->c = '3'; print_r(array_flip($obj)); // will NOT work in PHP 5.3, but will in PHP 5.2 print_r(array_flip((array) $obj)); // will work in PHP 5.3 and 5.2 |
魔术类方法现在受到更严格的限制。下面的方法必须具有公共可见性:
__get
__set
__isset
__unset
__call
现在,当在静态上下文中使用 __call
时,为了应对上述变化,可以使用新的 __callStatic()
魔术方法。除了不接受参数的__isString()
魔术方法以外,这些方法的必需参数都是强制性的,并且必须提供。清单 4 显示了如何使用这些方法以及它们的必需参数。
class Foo { public function __get($key) {} // must be public and have one parameter public function __set($key,$val) {} // must be public and have two parameters public function __toString() {} must be public and have no parameters } |
在 Windows 上,有些函数之前在 PHP 中不受支持,现在在 PHP V5.3 中获得支持。例如,getopt()
函数用于解析从命令行调用 PHP 脚本时使用的选项。用于编码和解码 Internet 地址的 inet_ntop()
和 inet_pton()
函数,现在也可以在 Windows® 上使用。还有一些数学函数,例如 asinh()
、acosh()
、atanh()
、log1p()
和 expm1()
,现在在 Windows 上也受支持。
PHP Extension C Library(PECL)一直都是 PHP 中的新扩展的来源地。当一个扩展已经成熟和稳定,并且被认为可以成为核心发行版中一个有用的功能,那么它通常在重大的版本变更时被添加进来。根据这条规则,从 PHP V5.3 开始,下面的扩展会成为核心 PHP 发行版中的一部分。
- FileInfo
- 提供帮助检测文件的内容类型和编码的函数,这些函数通过查看文件中的某些魔术字节字符序列进行检测。
- intl
- International Components for Unicode(ICU)库的一个包装器,提供用于 unicode 和全球化支持的函数。
- Phar
- 第 4 部分 中讨论过的一个 PHP 归档工具。
- mysqlnd
- 用于 MySQL 数据库访问的一个本地 PHP 驱动程序,是早期利用 libmysql 库的 MySQL 和 MySQLi 扩展的替代物。
- SQLite3
- 用于使用 SQLite V3 数据库的一个库。
当一个扩展不再受到积极的维护,或者被认为不值得随核心 PHP 发行版一起发行时,它通常被转移到 PECL。在 PHP V5.3 的改造过程中,下面这些扩展被踢出核心 PHP 发行版,而放在 PECL 中进行维护。
- ncurses
- 对 curses 的模拟,用于在命令行显示图形化的输出。
- fpdf
- 用于在 PDF 文档中构建和使用表单和表单数据。
- dbase
- 提供读写 dbase 兼容文件的支持。
- fbsql
- 支持 Frontbase 数据库服务器上的数据库访问。
- ming
- 一个开源库,用于创建 Flash 4 动画。
Sybase 扩展已经被完全移除,取而代之的是 sybase_ct 扩展。sybase_ct 扩展与前者完全兼容,应该是一个简易替代者(drop-in replacement)。这个更新的功能将使用 Sybase client 库,需要将这些库安装在 Web 服务器上。
PHP V5.3 着重改善了构建过程,因此更容易在所有平台上构建 PHP。为了维护 PHP 构建之间的一致性,并提供一组可靠的组件,在构建中不再禁用 PCRE、Reflection 和 SPL 扩展。现在,可以构建可分发的 PHP 应用程序,它们将使用这些扩展并且保证这些扩展是可用的。
一个新的团队在去年接管了 PHP Windows 构建。这个小组将为 Windows 上的用户提供一些改进。新的构建将以 586 架构(Intel® Pentium® 或更高型号)为目标,并要求 Windows 2000/XP 或更高版本,另外去掉了对 Windows 98/NT 及之前版本的支持。将构建使用 Microsoft® Visual Studio® 2008 构建的 PHP 构建和针对 x86-64 架构的构建。当和 Microsoft IIS Web 服务器上的 FastCGI 或者和 Apache 一起使用时,在使用相同的编译器和架构进行构建的情况下,它们可以提供更高的性能。Windows 安装程序也将有所改进,以便更好地在 Microsoft IIS Web 服务器上配置 PHP。该团队专门为 Windows 上的 PHP 建立了一个网站(参见 参考资料)。
PHP 的一个重要特性是,可以使用 .ini 文件配置它的行为。在 PHP V5.3 中,与这个文件有关的一些有问题的指令已经被删除,例如 zend.ze1_compatibility_mode。现在,在使用这个文件时,灵活性有了巨大的提高。
对于 php.ini 文件有两个重大的改进:
- 在 php.ini 文件中可以使用变量。这对于减少该文件的冗余非常方便,必要时更新文件也更加方便。清单 5 显示了一个例子。
清单 5. php.ini 文件中的变量
foo = bar [section] newfoo = ${bar}
foo 和 newfoo 有相同的值。 - 和用 Apache 配置文件进行设置一样,可以进行 per-directory 和 per-site PHP ini 设置。这样做的优点是,在所有不同的可运行 PHP 的 SAPI 中,语法都是一致的。清单 6 显示了如何进行 PHP ini 设置。
清单 6. per-site 和 per-directory .ini 设置
[PATH=/var/www/site1] ; directives here only apply to PHP files in the /var/www/site1 directory [HOST=www.example.com] ; directives here only apply to PHP files requested from the www.example.com site.
还可以像对待 Apache HTTP Web 服务器上的 .htaccess 文件一样,在用户指定的、位于文件系统的 .ini 文件中创建这些 .ini 指令。这个文件的默认文件名由 user_ini.filename 指令指定。通过将这条指令设置为空值,可以禁用该特性。在用户指定的 .ini 文件中,任何 per-site 和 per-directory 指令都不能被覆盖。
PHP V5.3 开始正式放弃一些较旧的函数,将来版本的 PHP 中将不再提供它们。当使用这些函数时,会遇到 E_DEPRECATED
错误。以下函数在 PHP V5.3 中被遗弃:
- tick(
declare(ticks=N)
和register_tick_function()
),之前用于在declare()
块中当解析器每执行 n 条语句时就进行一个函数调用。它们将被废除,因为它们的函数中有很多的中断,而且该特性不大常用。 define_syslog_variables()
,该函数初始化所有与 syslog 相关的变量。该函数不是必需的,因为它定义的常量已经被全局定义。废除这个函数调用应该是有必要的。ereg
正则表达式函数。建议使用 PCRE 正则表达式函数替代,因为它们更快,并且与其他语言和应用程序中使用的正则表达式更加一致。对ereg
函数的支持将被废除,以使 PHP 可以标准化地使用一个正则表达式引擎。
建议在迁移到 PHP V5.3 时移除这些特性。将来主要的 PHP 发行版将取消对上述特性的支持。