PHP V5.3 中的新特性,第 5 部分: 从 PHP V5.2 升级到 PHP V5.3

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 简介 本系列着重介绍 PHP V5.3 中的新特性,例如名称空间、闭包、对象管理、面向对象编程和 Phar。虽然这些动人的新特性作为该语言的增补广受欢迎,但 PHP V5.3 同时也是为进一步优化 PHP 而设计的。

简介

本系列着重介绍 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 中不再有效。


清单 1. 无效的 PHP 语句

				
// 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 语句的例子。


清单 2. PHP 中的 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 中,数组函数 atsortnatcasesortusortuasortuksortarray_flip 和 array_unique 可以以参数形式传递对象而不是数组。然后,这些函数将对象的属性当做数组的键和值。PHP V5.3 中不再支持这一点,所以需要首先将对象转换成数组。清单 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 显示了如何使用这些方法以及它们的必需参数。


清单 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 建立了一个网站(参见 参考资料)。

 

回页首

.ini 的变化

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 发行版将取消对上述特性的支持。

 
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
5月前
|
安全 IDE 编译器
深入理解PHP 7的新特性及其对现代Web开发的影响
【7月更文挑战第30天】本文将深入探索PHP 7版本中引入的关键新特性,并分析这些改进如何优化现代Web开发实践。通过对比PHP 5和PHP 7的性能差异,我们将揭示PHP 7如何提升应用响应速度和资源利用效率。此外,本文还将讨论PHP 7对开发者工作流程的影响,包括新的语言特性、错误处理机制以及内置函数的增强,旨在为读者提供全面了解PHP 7所带来的变革性影响。
|
5月前
|
存储 SQL 编译器
PHP 8新特性深度解析与实战应用
本文将深入探讨PHP 8的新增特性,并结合实际案例演示如何有效利用这些特性优化现有项目。通过本文,您将了解到PHP 8带来的性能提升、安全性增强以及代码简化等方面的改进,以及如何将这些新特性融入日常开发工作之中。 【7月更文挑战第29天】
54 8
|
5月前
|
缓存 安全 测试技术
深入PHP 7:新特性与性能提升解析
在PHP 7的发布中,我们见证了一系列令人兴奋的性能改进和新特性的加入。本文将深入探讨这些变化如何影响开发者的日常编程实践,并展示通过实际例子如何最大化利用PHP 7的优势。准备好迎接代码效率和开发体验的全新升级!
|
5月前
|
安全 API PHP
深入理解PHP 7的新特性及其对现代Web开发的影响
【7月更文挑战第29天】本文将探索PHP 7版本引入的一系列新特性,并分析它们如何革新了现代Web开发。我们将从性能提升、语言特性增强、以及面向对象编程的改进等方面进行详细讨论,旨在为开发者提供一份全面的PHP 7新特性指南,帮助他们更好地利用这些新工具优化和加速Web应用的开发。
|
5月前
|
大数据 编译器 API
PHP 7新特性深度解析与应用实践
【7月更文挑战第28天】本文深入探讨PHP 7带来的革新特性,从性能优化到语法改进,逐一剖析其背后的技术原理和实际影响。通过实例展示如何有效利用这些新特性来提升开发效率和代码质量,为PHP开发者提供切实可行的升级和优化策略。
|
5月前
|
存储 设计模式 安全
PHP 7新特性及其对现代Web开发的影响
随着PHP 7的发布,这一广泛使用的服务器端脚本语言带来了显著的性能提升和新的编程特性。本文将深入探讨PHP 7中的关键更新,包括性能优化、类型声明、异常处理改进以及匿名类等,并分析这些变化如何影响现代Web开发的实践和模式。通过具体案例,我们将了解开发者如何利用这些新特性来编写更快、更安全、更易维护的代码。 【7月更文挑战第28天】
38 3
|
5月前
|
安全 编译器 API
深入理解PHP 8的新特性及其对现代Web开发的影响
【7月更文挑战第29天】随着PHP 8的发布,这个广受欢迎的服务器端脚本语言迎来了重大更新。本文将深入探讨PHP 8引入的关键新特性,包括JIT编译器、联合类型、命名参数、匹配表达式以及错误处理改进等,并分析这些变化如何影响现代Web开发实践。我们将通过具体示例和代码片段,展示这些新特性如何提升性能、增强类型安全和支持更简洁的代码编写,同时讨论它们对现有PHP项目的迁移和维护的潜在影响。
43 2
|
5月前
|
设计模式 缓存 PHP
深入理解PHP 7中的新特性与性能优化
【7月更文挑战第28天】本文将探索PHP 7版本中引入的新特性及其对性能的影响。不同于传统的功能介绍,我们将通过实际代码示例和性能分析,揭示这些新特性如何提升开发效率和应用程序的运行速度,同时指出在实际应用中可能遇到的陷阱与挑战。
|
5月前
|
存储 监控 大数据
深入理解PHP 7的新特性及其性能优化技巧
【7月更文挑战第26天】随着PHP 7的发布,这一广泛使用的编程语言迎来了重大的性能提升和新特性。本文将深入探讨PHP 7的核心改进点,包括性能提升的原因、新引入的语言特性以及如何利用这些变化来优化现有和未来的PHP项目。我们将通过实际代码示例和性能分析工具来展示如何有效地应用这些新特性以达到最佳的性能表现。
|
5月前
|
编译器 PHP 开发者
探索PHP 8的新特性及其对现代Web开发的影响
随着PHP 8的发布,这个广受欢迎的服务器端脚本语言迎来了一系列令人兴奋的新特性和性能改进。本文将深入探讨PHP 8中的一些关键更新,包括JIT编译器、联合类型、命名参数、匹配表达式等,并讨论这些变化如何影响现代Web开发的实践。我们将通过具体示例来揭示新特性的实际应用场景,同时分析它们可能给开发者带来的挑战与机遇。文章旨在为读者提供一份关于PHP 8新特性的实用指南,帮助他们更好地适应这一新版本的语言环境。