/ PHP

【转】PHP5.3 PHP5.4 PHP5.5 新特性

因为用到PHP新版本,一些新特性必须要了解,且有些可以在开发时就使用,如果不使用,那么何必升级PHP版本呢,显得有些得不偿失了!
所以整理了一下 一些特性,有可能不全,待添加

PHP 5.3中的新特性

一.PHP 5.3中的新特性

  1. 支持命名空间 (Namespace)
  2. 支持延迟静态绑定(Late Static Binding)
  3. 支持goto语句
  4. 支持闭包、Lambda/Anonymous函数
  5. 新增两个魔术方法__callStatic()和__invoke()
  6. 新增Nowdoc语法
  7. 在类外也可使用const来定义常量
  8. 三元运算符增加了一个快捷书写方式:
  9. HTTP状态码在200-399范围内均被认为访问成功
    10.支持动态调用静态方法
    1.支持命名空间 (Namespace)
    毫无疑问,命名空间是PHP5.3所带来的最重要的新特性。有了命名空间的概念,在开发大型站点时,就比较容易设计出灵活的结构,同时避免不同包中的类名或变量名产生冲突。

在PHP5.3之前,惯例的划分Package的办法是通过目录名来分隔代码文件,代码中的类名则用下划线_来表示目录。例如

这样的命名方式被PEAR、Zend Framework及各种PHP项目广泛采用。虽然该方法可以避免不同包或类库中的类名产生冲突,但在书写代码的时候显得较为麻烦和笨拙。
在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符为反斜杆\。
select.php

这样即使其它命名空间下存在名为Select的类,程序在调用时也不会产生冲突。代码的可读性也有所增加。
调用方法
call.php

test(); ?>

** 2.支持延迟静态绑定(Late Static Binding)**
在PHP5中,我们可以在类中通过self关键字或者__CLASS__来判断或调用当前类。但有一个问题,如果我们是在子类中调用,得到的结果将是父类。因为在继承父类的时候,静态成员就已经被绑定了。 例如:

以上代码输出的结果是:
A
这和我们的预期不同,我们原来想得到子类的相应结果。
PHP 5.3.0中增加了一个static关键字来引用当前类,即实现了延迟静态绑定:

以上代码输出的结果是:
B
3.支持goto语句
多数计算机程序设计语言中都支持无条件转向语句goto,当程序执行到goto语句时,即转向由goto语句中的标号指出的程序位置继续执行。尽管goto语句有可能会导致程序流程不清晰,可读性减弱,但在某些情况下具有其独特的方便之处,例如中断深度嵌套的循环和 if 语句。

4.支持闭包、Lambda/Anonymous函数
闭包(Closure)函数和Lambda函数的概念来自于函数编程领域。例如JavaScript 是支持闭包和 lambda 函数的最常见语言之一。

在PHP中,我们也可以通过create_function()在代码运行时创建函数。但有一个问题:创建的函数仅在运行时才被编译,而不与其它代码同时被编译成执行码,因此我们无法使用类似APC这样的执行码缓存来提高代码执行效率。

在PHP5.3中,我们可以使用Lambda/匿名函数来定义一些临时使用(即用即弃型)的函数,以作为array_map()/array_walk()等函数的回调函数。

** 5. 新增两个魔术方法__callStatic()和__invoke()**
PHP中原本有一个魔术方法__call(),当代码调用对象的某个不存在的方法时该魔术方法会被自动调用。新增的__callStatic()方法则只用于静态类方法。当尝试调用类中不存在的静态方法时,__callStatic()魔术方法将被自动调用。

runTest('通过对象调用'); MethodTest::runTest('静态调用'); // As of PHP 5.3.0 ?>

以上代码执行后输出如下:
调用对象方法’runTest’ –- 通过对象调用调用静态方法’runTest’ –- 静态调用
以函数形式来调用对象时,__invoke()方法将被自动调用。(注:原文此处代码不正确)

支持通过Heredoc来初始化静态变量、类成员和类常量。

** 7. 在类外也可使用const来定义常量**
PHP中定义常量通常是用这种方式:

并且新增了一种常量定义方式:

8. 三元运算符增加了一个快捷书写方式

原本格式为是(expr1) ? (expr2) : (expr3)
如果expr1结果为True,则返回expr2的结果。

PHP5.3新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3
如果expr1结果为True,则返回expr1的结果

9. HTTP状态码在200-399范围内均被认为访问成功
10.支持动态调用静态方法

  1. 支持嵌套处理异常(Exception)
  2. 新的垃圾收集器(GC),并默认启用

二.PHP5.3中其它值得注意的改变

  1. 修复了大量bug
  2. PHP性能提高
  3. php.ini中可使用变量
  4. mysqlnd进入核心扩展 理论上说该扩展访问mysql速度会较之前的MySQL 和 MySQLi 扩展快(参见http://dev.mysql.com/downloads/connector/php-mysqlnd/)
  5. ext/phar、ext/intl、ext/fileinfo、ext/sqlite3和ext/enchant等扩展默认随PHP绑定发布。其中Phar可用于打包PHP程序,类似于Java中的jar机制。
  6. ereg 正则表达式函数 不再默认可用,请使用速度更快的PCRE 正则表达式函数

PHP 5.4中的新特性

1. Buid-in web server内置了一个简单的Web服务器
把当前目录作为Root Document只需要这条命令即可:

php -S localhost:3300

也可以指定其它路径:

php -S localhost:3300 -t /path/to/root

还可以指定路由:

php -S localhost:3300 router.php

2.Traits
Traits提供了一种灵活的代码重用机制,即不像interface一样只能定义方法但不能实现,又不能像class一样只能单继承。至于在实践中怎样使用,还需要深入思考。
魔术常量为__TRAIT__

3. Short array syntax 数组简短语法

"bar",   "bar" => "foo"   ]; ** 4. Array dereferencing 数组值** show(); ** 9.支持 Class::{expr}() 语法** {'hello'}(); } ** 10.Callable typehint** 12.新增加了$_SERVER[“REQUEST_TIME_FLOAT”],这个是用来统计服务请求时间的,并用ms来表示 getFriends())将会抛出一个错误。作为PHP5.5 这将成为有效的代码 **7.获取完整类别名称** PHP5.3 中引入命名空间的别名类和命名空间短版本的功能。虽然这并不适用于字符串类名称 seconds / 3600; } set { $this->seconds = $value * 3600; } } } $timePeriod = new TimePeriod; $timePeriod->hours = 10; var_dump($timePeriod->seconds); // int(36000) var_dump($timePeriod->hours); // int(10) 当然还有更多的功能,比如只读属性。如果你想要知道更多,请参阅 RFC。 **11.生成器** 目前,自定义迭代器很少使用,因为它们的实现,需要大量的样板代码。生成器解决这个问题,并提供了一种简单的样板代码来创建迭代器。 例如,你可以定义一个范围函数作为迭代器: firstName]; 上述列表解析相等于下面的代码: $firstNames = []; foreach ($users as $user) { $firstNames[] = $user->firstName; } 也可以这样过滤数组: $underageUsers = [foreach ($users as $user) if ($user->age < 18) yield $user]; 生成器表达式也很类似,但是返回一个迭代器(用于动态生成值)而不是一个数组。 **13.finally关键字** 这个和java中的finally一样,经典的try … catch … finally 三段式异常处理。 **14.foreach 支持list()** 对于“数组的数组”进行迭代,之前需要使用两个foreach,现在只需要使用foreach + list了,但是这个数组的数组中的每个数组的个数需要一样。看文档的例子一看就明白了。
【转】PHP5.3 PHP5.4 PHP5.5 新特性
Share this