文章转自:http://wulijun.github.io/2013/07/17/whats-new-in-php-5-5.html

     http://www.cnblogs.com/yjf512/p/3164400.html

生成器(Generators)

生成器是其中最令人期待的一个新特性,它使得开发者无需实现迭代器接口,就能实现遍历功能。编写一个实现迭代器接口的类,需要拷贝很多重复 的代码,现在使用生成器,就可以减少代码量和复杂度。

生成器通过新增的关键字yield实现,外形和普通函数类似,但是和函数只返回单个值不同的是,生成器可以生成任意个值。下面通过一个例子展示其 强大功能。考虑PHP中的range()函数,它返回介于$start和$end之间的数值数组,如以下用法:

<?php
foreach (range(, ) as $number) {
echo $number;
}

这个例子中range()函数返回的数组将会占用大量的内存(大约100多Mb),撇开这个简单的例子,现实程序中,也经常需要创建巨大的数组,它们耗费 大量的时间和内存。引入生成器之后,我们就无需编写迭代器类,也能解决这个问题。生成器不会创建一个大数组,而是每次迭代的时候返回一个值。 上面这个例子可以改成使用生成器的版本:

<?php
// define a simple range generator
function generateRange($start, $end, $step = ) {
for ($i = $start; $i < $end; $i += $step) {
// yield one result at a time
yield $i;
}
} foreach (generateRange(, ) as $number) {
echo $number;
}

这个代码的运行结果和第一个例子一样,但是运行过程中不会创建一个大数组保存所有的值,因而只需不到1K的内存,比原来的代码大大节省了内存 的消耗。

密码哈希

新的密码哈希API是PHP5.5中非常重要和实用的特性。以前,开发者只能依赖其他的crypt()函数,而这些函数的文档又不是很齐全,导致很多误用。 现在新增的API简单明了,方便开发者实现安全的密码哈希功能。

新API包含password_hash()和password_verify()等函数,调用password_hash($password, PASSWORD_DEFAULT)返回一个使用bcrypt加密,并自动添加 了salting的哈希值。验证密码的时候则调用password_verify($password, $hash)。API现在默认使用bcrypt,将来可能会引入其他新的更安全的加密 方式。开发者可以自己调整bcrypt的参数来提高加密强度,可以自己指定salt值等(但是官方不建议这么做)。

finally

PHP5.5开始支持其他语言的异常处理中常用的finally关键字,开发者可以从此在try和catch块之后,运行指定代码,而无需关心是否有异常抛出,然 后再回到正常执行流,而在此之前,开发者只能在try和catch块中拷贝代码,来完成相关的任务清理工作。比如下面的例子,必须在两个地方 调用releaseResource():

<?php
function doSomething() {
$resource = createResource();
try {
$result = useResource($resource);
}
catch (Exception $e) {
releaseResource($resource);
log($e->getMessage());
exit();
}
releaseResource($resource);
return $result;
}

  

有了finally关键字后,就可以删除冗余代码:

<?php
function doSomething() {
$resource = createResource();
try {
$result = useResource($resource);
return $result;
}
catch (Exception $e) {
log($e->getMessage());
exit();
}
finally {
releaseResource($resource);
}
}

修改后的代码,我们只需在finally块中调用清理函数releaseResource(),无论流程最终是走到try中的return语句,还是到catch中的exit,finally 中的代码都会执行。

数组和字符串字面量解引用

现在访问数组的语法中,支持数组和字符串字面量的解引用:

<?php
// array dereferencing - returns 3
echo [, , , ][]; // string dereferencing - returns "l"
echo "hello"[];

这个特性主要是增强了语言的一致性,对我们平时写代码的行为可能影响不大,但是在某些情景下使用还是非常便利的:

<?php
$randomChar = "abcdefg0123456789"[mt_rand(, )];

empty()支持函数调用和表达式

empty()这个语言结构开始支持在函数调用和表达式中使用,如empty($object->getProperty())。这样就可以用empty()判断函数返回值,而不 用先把返回值赋值给一个临时变量,然后对临时变量使用empty()。

类名解析

从PHP5.3引入命名空间之后,使用它来组织PHP项目中的类结构已经司空见惯,但是要取回带命名空间的全限定类名,却是非常的困难,如:

<?php
use Namespaced\Class\Foo; $reflection = new ReflectionClass("Foo");

这个代码将会失败,因为它会从全局命名空间中查找类Foo,而不是指定的命名空间。PHP5.5引入了class关键字,可以通过它获取全限定类名:

<?php
use Namespaced\Class\Foo; $reflection = new ReflectionClass(Foo::class);

上面的代码中,Foo:class会解析为"Namespaced\Class\Foo"。

foreach改进

list()语言结构可以便捷地把数组中的值赋给一组变量,如:

<?php
$values = ["sea", "blue"];
list($object, $description) = $values; // returns "The sea is blue"
echo "The $object is $description";

现在开始可以在foreach遍历多维数组时,使用list():

<?php
$data = [
["sea", "blue"],
["grass", "green"]
]; foreach ($data as list($object, $description)) {
echo "The $object is $description\n";
} /* Outputs:
The sea is blue
The grass is green
*/

这个特性使得嵌套数组的遍历变得更加的容易和简洁,并且foreach循环开始支持非标量的值作为迭代器的key,即元素的key可以是字符串和整数之外的 其他类型值。

结论

PHP5.5为PHP的高效开发提供了许多改进,除了这些新特性,也修改了大量的bug,具体参考ChangeLog

原文链接:http://phpmaster.com/whats-new-in-php-5-5/

 

PHP 5.5 新特性的更多相关文章

  1. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  2. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  3. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  4. CSS3新特性应用之结构与布局

    一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...

  5. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  6. 跨平台的 .NET 运行环境 Mono 3.2 新特性

    Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...

  7. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  8. es6 新特性2

    es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...

  9. ES6 新特性

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  10. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

随机推荐

  1. response与文件下载

    参考博客: http://www.cnblogs.com/lcpholdon/p/4380980.html http://www.cnblogs.com/mingforyou/p/3281945.ht ...

  2. 在VS里配置及查看IL

    在VS里配置及查看IL 来源:网络 编辑:admin 在之前的版本VS2010中,在Tools下有IL Disassembler(IL中间语言查看器),但是我想直接集成在VS2012里使用,方法如下: ...

  3. 一款可以下拉搜索html下拉框控件

    直接上图,组件不错,支持静态和动态搜索,这个只是在原控件上自己修改样式后的,这里主要记录一下,在修改别人控件时,应该如何去封装代码: 原控件:http://ivaynberg.github.com/s ...

  4. Android程序设计-简单手机通讯录

    在微信中,手机QQ中你会发现软件读取手机通讯录这个功能,这个功能使得软件更好的与手机联系人绑定,从而达到分享,拨打电话,读取用户信息等操作.下面我们将通过一个demo实现这个功能 首先我们看一下效果图 ...

  5. xcoj 1208 矩阵

    赛场上一开始以为是递推,交了一发希望以为能卡着线过(毕竟是O(5N)的),结果WA了. 又以为是dp,最后半小时尝试各种YY...各种WA 实际上取每次transfer中最大的概率然后递推是不对的.. ...

  6. PHP之:随机抽取一个数&&随机函数

    撰写日期:2016-7-20 16:00:24 有5个数:1 4 7 9 6 用PHP实现随机抽取5个数中的其中一个 方法一: <?php $test = array(1,4,7,9,6);// ...

  7. CDN网络(二)之配置和优化CDN核心缓存软件--squid

    前言 squid是众多CDN厂商使用的核心缓存软件,都在已有的基础上进行二次开发.在部署squid的时候,建议遵循下面的规范. 1. 使用大内存服务器 对于热点文件,我们让squid用内存缓存,这样大 ...

  8. PHP-权限控制类

    http://blog.csdn.net/painsonline/article/details/7183679 <?php /** * 权限控制类 */ class include_purvi ...

  9. BZOJ3207: 花神的嘲讽计划Ⅰ

    显然hash,然后stl随便搞. #include<bits/stdc++.h> #define N 100005 using namespace std; typedef unsigne ...

  10. CentOS6.5 安装Sphinx 配置MySQL数据源

      前提安装完mysql,并创建测试表和数据 DROP TABLE IF EXISTS `documents`; CREATE TABLE IF NOT EXISTS `documents` ( `i ...