PHP>5.3版本部分新功能

【PHP5.3的新增、改进】匿名函数
也叫闭包(Closures), 经常被用来临时性地创建一个无名函数,用于回调函数等用途。

Java代码  

  1. $func = function ($arg) {  
  2.     print $arg;  
  3. };  
  4. $func("Hello World");  

 匿名函数还可以用 use 关键字来捕捉外部变量:

Java代码  

  1. function arrayPlus($array, $num)  
  2. {  
  3.     array_walk($array, function (&$v) use ($num) {  
  4.         $v += $num;  
  5.     });  
  6. }  

上面的代码定义了一个 arrayPlus() 函数(这不是匿名函数), 它会将一个数组($array)中的每一项,加上一个指定的数字($num).在 arrayPlus() 的实现中,我们使用了 array_walk() 函数,它会为一个数组的每一项执行一个回调函数,即我们定义的匿名函数。在匿名函数的参数列表后,我们用 use 关键字将匿名函数外的 $num 捕捉到了函数内,以便知道到底应该加上多少。

后期静态绑定PHP的继承模型中有一个存在已久的问题,那就是在父类中引用扩展类的最终状态比较困难。

Java代码  

  1. <?php  
  2. class ParentBase  
  3. {  
  4.     static $property = 'Parent Value';  
  5.   
  6.     public static function render()  
  7.     {  
  8.         return self::$property;  
  9.     }  
  10.   
  11. }  
  12.   
  13. class Descendant extends ParentBase  
  14. {  
  15.     static $property = 'Descendant Value';  
  16. }  
  17.   
  18. //output: Parent Value  
  19. echo Descendant::render();  

在这个例子中,render()方法中使用了self关键字,这是指ParentBase类而不是指Descendant类。在 ParentBase::render()方法中没法访问$property的最终值。为了解决这个问题,需要在子类中重写render()方法。通过引入延迟静态绑定功能,可以使用static作用域关键字访问类的属性或者方法的最终值

Java代码  

  1. <?php  
  2.   
  3. class ParentBase  
  4. {  
  5.     static $property = 'Parent Value';  
  6.   
  7.     public static function render()  
  8.     {  
  9.         return static::$property;  
  10.     }  
  11.   
  12.     public static function status()  
  13.     {  
  14.         static::getStatus();  
  15.     }  
  16.   
  17.     protected static function getStatus()  
  18.     {  
  19.         echo "Person is alive";  
  20.     }  
  21. }  
  22.   
  23. class Descendant extends ParentBase  
  24. {  
  25.     static $property = 'Descendant Value';  
  26. }  
  27.   
  28. //output: Descendant Value  
  29. echo Descendant::render();  

PHP的面向对象体系中,提供了若干“魔术方法”,用于实现类似其他语言中的“重载”,如在访问不存在的属性、方法时触发某个魔术方法。

__call($funcname, $arguments)

__callStatic($funcname, $arguments)

参数说明:

$funcname String 调用的不存在的方法名称。

$arguments Array 调用方法时所带的参数。
 __invoke魔术方法会在将一个对象作为函数调用时被调用:

Java代码  

  1. class A  
  2. {  
  3.     public function __invoke($args)  
  4.     {  
  5.         print "A::__invoke(): {$args}";  
  6.     }  
  7. }  
  8.   
  9. $a = new A;  
  10. //output: A::__invoke(): Hello World  
  11. $a("Hello World");  

 __callStatic则会在调用一个不存在的静态方法时被调用,有了__callStatic,可以省不少代码了。而且这个方法支持在子类中调用,配合上get_called_class,子类也一起魔术了

Java代码  

  1. <?php  
  2.   
  3. class ActiveRecordBase  
  4. {  
  5.     /**  As of PHP 5.3.0  */  
  6.     public static function __callStatic($func, $arguments)  
  7.     {  
  8.         if ($func == 'getById') {  
  9.             $id = $arguments[0];  
  10.             return get_called_class() . '(' . $id . ')';  
  11.         }  
  12.   
  13.         throw new Exception('Invalid method : ' . $name);  
  14.     }  
  15. }  
  16.   
  17. class Person extends ActiveRecordBase  
  18. {  
  19.   
  20. }  
  21.   
  22. // output: Person(123)  
  23. echo Person::getById(123);  

__call 当要调用的方法不存在或权限不足时,会自动调用__call 方法。

Java代码  

  1. <?php  
  2.   
  3. class Db  
  4. {  
  5.     private $sql = array(  
  6.         "field" => "",  
  7.         "where" => "",  
  8.         "order" => "",  
  9.         "limit" => "",  
  10.         "group" => "",  
  11.         "having" => "",  
  12.     );  
  13.   
  14.     // 连贯操作调用field() where() order() limit() group() having()方法,组合sql语句  
  15.     function __call($methodName, $args)  
  16.     {  
  17.         // 将第一个参数(代表不存在方法的方法名称),全部转成小写方式,获取方法名称  
  18.         $methodName = strtolower($methodName);  
  19.   
  20.         // 如果调用的方法名和成员属性数组$sql下标对应上,则将第二个参数给数组中下标对应的元素  
  21.         if (array_key_exists($methodName, $this->sql)) {  
  22.             $this->sql[$methodName] = $args[0];  
  23.         } else {  
  24.             echo '调用类' . get_class($this) . '中的方法' . $methodName . '()不存在';  
  25.         }  
  26.         // 返回自己对象,则可以继续调用本对象中的方法,形成连贯操作  
  27.         return $this;  
  28.     }  
  29.   
  30.     // 输出连贯操作后组合的一个sql语句,是连贯操作最后的一个方法  
  31.     function select()  
  32.     {  
  33.         echo "SELECT {$this->sql['field']} FROM  user {$this->sql['where']} {$this->sql['order']} {$this->sql['limit']} {$this->sql['group']}  
  34.                 {$this->sql['having']}";  
  35.     }  
  36. }  
  37.   
  38. $db = new Db();  
  39.   
  40. // 连贯操作  
  41. $db->field('sex, count(sex)')  
  42.     ->where('where sex in ("男","女")')  
  43.     ->group('group by sex')  
  44.     ->having('having avg(age) > 25')  
  45.     ->select();  
  46. ?>  

命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。

Java代码  

  1. <?php  
  2. //创建空间Blog  
  3. namespace Blog;  
  4.   
  5. class Comment  
  6. {  
  7. }  
  8.   
  9. //非限定名称,表示当前Blog空间  
  10. //这个调用将被解析成 Blog\Comment();  
  11. $blog_comment = new Comment();  
  12.   
  13. //限定名称,表示相对于Blog空间  
  14. //这个调用将被解析成 Blog\Article\Comment();  
  15. $article_comment = new Article\Comment(); //类前面没有反斜杆\  
  16.   
  17. //完全限定名称,表示绝对于Blog空间  
  18. //这个调用将被解析成 Blog\Comment();  
  19. $article_comment = new \Blog\Comment(); //类前面有反斜杆\  
  20.   
  21. //完全限定名称,表示绝对于Blog空间  
  22. //这个调用将被解析成 Blog\Article\Comment();  
  23. $article_comment = new \Blog\Article\Comment(); //类前面有反斜杆\  
  24.   
  25.   
  26. //创建Blog的子空间Article  
  27. namespace Blog\Article;  
  28.   
  29. class Comment  
  30. {  
  31. }  
  32. ?>  

别名和导入可以看作是调用命名空间元素的一种快捷方式。PHP并不支持导入函数或常量。 它们都是通过使用use操作符来实现:

Java代码  

  1. <?php  
  2. namespace Blog\Article;  
  3.   
  4. class Comment  
  5. {  
  6. }  
  7.   
  8. //创建一个BBS空间(我有打算开个论坛)  
  9. namespace BBS;  
  10.   
  11. //导入一个命名空间  
  12. use Blog\Article;  
  13.   
  14. //导入命名空间后可使用限定名称调用元素  
  15. $article_comment = new Article\Comment();  
  16.   
  17. //为命名空间使用别名  
  18. use Blog\Article as Arte;  
  19.   
  20. //使用别名代替空间名  
  21. $article_comment = new Arte\Comment();  
  22.   
  23. //导入一个类  
  24. use Blog\Article\Comment;  
  25.   
  26. //导入类后可使用非限定名称调用元素  
  27. $article_comment = new Comment();  
  28.   
  29. //为类使用别名  
  30. use Blog\Article\Comment as Comt;  
  31.   
  32. //使用别名代替空间名  
  33. $article_comment = new Comt();  
  34. ?>  

 PHP5.4

数组简写形式

Java代码  

  1. <?php  
  2. //原来的数组写法  
  3. $arr = array("key" => "value", "key2" => "value2");  
  4. // 简写形式  
  5. $arr = ["key" => "value", "key2" => "value2"];  
  6. ?>  

Traits
所谓Traits就是“构件”,是用来替代继承的一种机制。Trait和类相似,但不能被实例化PHP中无法进行多重继承,但一个类可以包含多个Traits.

Java代码  

  1. <?php  
  2. trait SayWorld  
  3. {  
  4.     public $var = 'test';  
  5.     public function sayHello()  
  6.     {  
  7.         echo 'World!';  
  8.     }  
  9. }  
  10.   
  11. class MyHelloWorld  
  12. {  
  13.     // 将SayWorld中的成员包含进来  
  14.     use SayWorld;  
  15. }  
  16.   
  17. $xxoo = new MyHelloWorld();  
  18. // sayHello()函数是来自SayWorld构件的 $xxoo->var  
  19. $xxoo->sayHello();  

Traits还有很多神奇的功能,比如包含多个Traits, 解决冲突,修改访问权限,为函数设置别名等等。

新增在实例化时访问类成员的特征:

Java代码  

  1. (new MyClass)->xxoo();  

 新增支持对函数返回数组的成员访问解析

Java代码  

  1. print [1, 2, 3][0];  

 PHP5.5

yield的一个功能就是能有效的降低迭代的内存开销,yield关键字用于当函数需要返回一个迭代器的时候, 逐个返回值.也就是说, 每当产生一个数组元素, 就通过yield关键字返回成一个, 并且函数执行暂停, 当返回的迭代器的next方法被调用的时候, 会恢复刚才函数的执行, 从上一次被yield暂停的位置开始继续执行, 到下一次遇到yield的时候, 再次返回.

Java代码  

  1. <?php  
  2. function generators()  
  3. {  
  4.     for ($i = 1; $i <= 10; $i += 1) {  
  5.         yield $i;  
  6.     }  
  7.   
  8. }  
  9.   
  10. foreach (generators() as $v) {  
  11.     echo $v;  
  12. }  

 可以用 list() 在 foreach 中解析嵌套的数组:

Java代码  

  1. $array = [  
  2.     [1, 2, 3],  
  3.     [4, 5, 6],  
  4. ];  
  5.   
  6. foreach ($array as list($a, $b, $c))  
  7.     echo "{$a} {$b} {$c}\n";  

 aaa

时间: 2024-11-08 22:06:17

PHP>5.3版本部分新功能的相关文章

PHP5各个版本的新功能和新特性总结

 因为 PHP 那"集百家之长"的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目录: PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束 PHP5.2:JSON 支持 PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,Phar PHP5.4:Short Open Tag, 数组简写形式,

PHP5各个版本的新功能和新特性总结_php技巧

本文目录:PHP5.2 以前:autoload, PDO 和 MySQLi, 类型约束PHP5.2:JSON 支持PHP5.3:弃用的功能,匿名函数,新增魔术方法,命名空间,后期静态绑定,Heredoc 和 Nowdoc, const, 三元运算符,PharPHP5.4:Short Open Tag, 数组简写形式,Traits, 内置 Web 服务器,细节修改PHP5.5:yield, list() 用于 foreach, 细节修改PHP5.6: 常量增强,可变函数参数,命名空间增强 一.PH

静电为你解读SKETCH3.7版本新功能

  Sketch3.7版本来啦,一起来跟静电熟悉下Sketch3.7版本的新功能,本次更新的一大亮点就是全新的元件功能了,也是Sketch这次大版本的主要特色.不多说,直接看总结! 创新的元件功能 在Sketch3.7版本中,创建元件将使用全新的方式.当我们将某个图层或者组转化成元件时,会直接弹出提示框.点击后,元件就创建完成了,当然我们可以勾选下方的Send Symbol- 将它单独放在page里. 元件创建后,我们可以直接双击元件进入元件编辑状态对元件内容进行编辑,点击Return to I

值得关注:Java 1.4 即将发布版本的性能和新功能一览(转自IBM developerWorks)

性能 dW at JavaOne: 下一波 -- Java 1.4英文原文内容:JSR 在 1.4 版本中的删除部分XML API 发展得太快用户有一个参数选择断言培训记录新世界"N" 代表"新的"数据库的库到达内核进入所需的认证路径利用 WebStart 的快速开始"Tiger" 的眼睛超越 JSR考虑转向 1.4参考资料关于作者对本文的评价相关内容:一个识别用户的三向解决方案使用类属在编译时找出更多的错误Merlin 的魔力:Swing 的新

Sybase 12.5各版本新功能完全展示

ASE12.5.0.3新功能 一.性能监测系统表 一组新的系统性能监测系统表,利用这些系统表中的信息对分析ASE服务器的性能非常方便.这些性能监测系统表也是DB-XRAY的工作基础. MDA表,安装和配置文档中都有,这个很有用的. 二.多个临时库 能够让你在系统临 数据库tempdb外创建用户临时数据库.使用多个临时数据库的主要目的是减轻对系统临时数据库中系统表和日志表的争用. 三.外部文件系统 能够让你通过SQL语言访问外部文件系统,通过创建代理表将数据表映射到外部文件系统的文件目录或文件.

MyBatis 3.3.1 版本新功能示例

MyBatis 3.3.1版本新功能示例 MyBatis3.3.1更新日志: https://github.com/mybatis/mybatis-3/issues?q=milestone%3A3.3.1 这里不对更新做翻译或者其他详细介绍.  这个更新除了一些bug修复,还有两个新增的功能: 增加了对批量插入回写自增主键的功能 增加了注解引用@Results的功能 下面通过简单例子来介绍这两个功能,为了例子的简洁,这里都使用注解实现的,没有用XML,批量插入的例子很容易就能变成XML形式的,大

谷歌公布新iOS版本Gmail客户端 功能更丰富

谷歌Gmail是很多用户选择的产品,在原生Android系统当中已经提供了该服务,但为了满足用户谷歌还针对iOS系统提供了客户端下载.最近iOS版本的Gmail客户端升级,有很大的变化. 根据信息显示,这次升级让Gmail的iOS版本有了全新外观,改进搜索功能,可以获得即时结果和拼写建议,另外还有撤消发送功能,防止意外发送电子邮件,用户也获得了滑动归档功能,让用户更容易管理收件箱. 该应用程序现在更类似于谷歌推出的Inbox 软件和安卓版的Gmail客户端.它采用了材料设计进行界面改造,包括全新

中搜微件开放平台发布1.3版本 增加7项新功能

2013年4月27消息.昨日,中搜微件开放平台发布1.3版本,增加和优化了数据统计.应用冻结.开发者论坛.定时任务等7项新功能,新版本进一步考虑了开发者的需求.值得提及的是,1.3版本上线距1.2版本只有短短一个月时间. 据介绍,中搜微件开放平台1.3版本推出了全新的管理系统首页功能,整合系统中待办事项统计和快速入口,方便开发者及时了解开发进度,这样大大提高了开发者的工作效率.并且页面风格更加清晰,便于快速查询微件开发及运行状态. 此外,新版本还对原来的功能进行了升级优化,其中最明显的是优化了定

微信5.1版本新功能

日前,备受关注的微信5.1版在新版应用宝抢先体验,通过官方商店"应用宝"抢先体验微信5.1版,用户即可抢先申请百人大群权限.这次是 Android 测试版本在应用宝首发,用户需要安装最新版的应用宝 App 才能下载,和微信 5.0 的推广方式如出一辙.此举的目的无他,就是为了带动应用宝的安装量和活跃度. 微信5.1版新功能如下: 1.群聊现在可容纳100人 2.飞机大战给你关心的人充话费并带上心意卡 3.在表情购买界面,长按表情可预览 4.未发出的消息草稿,会显示在聊天列表中 据悉,作