最近在用php开发时项目中遇到了版本问题,特此记录下php不同版本的一些特性记录,以备忘。

一:php5.3中的新特性

1)开始支持命名空间(Namespace)

2)支持延迟静态绑定(Late Static Binding)

3 ) 支持goto语句

4)支持闭包、Lambda/Anonymous函数

5)新增了两个魔术方法 __callStatic()和_invoke()

6)在类外也可使用const来定义常量

7)支持动态调用静态方法

①在5.3之前,惯例的划分Package的办法是通过目录名来分隔代码文件的,代码中的类名则用下划线(_)来表示目录

  1. <?php
  2. //用以下的命名方式表示该类文件在Zend/Db/Table/Select目录下
  3. class Zend_Db_Table_Select{}

这样的命名方式被PEAR,以及Zend Framework及一些PHP项目广泛采用,虽然这样可以避免类名之间的冲突,但这样的书写方式显得很臃肿。在php5.3中只需要指定不同的命名空间就可以了(注意空间名之间用‘\’进行分隔)。

  1. <?php
  2. namespace Zend\DB\Table
  3. class Select{ }

②支持延迟静态绑定(Late Static Binding)

在php5中,我们可以在类中通过self关键字或者__CLASS__来判断或调用当前类,但如果我们在子类中调用,结果却是父类,因为在继承父类的时候,静态成员就已经绑定了,eg:

  1. <?php
  2. class A{
  3. public static function who(){
  4. echo __CLASS__ ;
  5. }
  6. public static function test(){
  7. self::who();
  8. }
  9. }
  10.  
  11. class B extends A{
  12. public static function who(){
  13. echo __CLASS__;
  14. }
  15. }
  16.  
  17. B::test();
  18. //结果为A

这显然和我们预期的结果不太一样,我们希望的结果是B(在继承父类的时候已经进行了绑定),在PHP5.3中增加了一个static关键字来引用当前类,既可以实现延迟静态绑定。

  1. <?php
  2. class A{
  3. public static function who(){
  4. echo __CLASS__ ;
  5. }
  6. public static function test(){
  7. // self::who();
  8. static::who();//这里用static实现的延迟静态绑定
  9. }
  10. }
  11.  
  12. class B extends A{
  13. public static function who(){
  14. echo __CLASS__;
  15. }
  16. }
  17.  
  18. B::test();
  19. //结果为B

③支持goto语句

大多数的编程语言都支持无条件的转向语句goto,你可能刚开始学编程的时候老师或者书上就告诉你不要使用goto语句,这样可能会导致程序流程混乱,可读性变差,实践证明这句话是对的,但万事有例外,某些情况下goto语句还是具有其独特的方便之处的,例如中断深度嵌套的循坏和if语句

  1. <?php
  2. goto a;
  3. echo "Foo";
  4. a:
  5. echo 'Bar';
  6. for($i = 0;$j = 50;$i < 100;$i++){
  7. while($j--){
  8. if($j == 17) goto end;
  9. }
  10. }
  11.  
  12. echo "i = $i";
  13. end:
  14. echo "j hit 17";

④支持闭包、Lambda、Anonymous函数

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

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

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

  1. <?php
  2.  
  3. echo preg_replace_callback('/([a-z])/',function($match){
  4. return strtoupper($match[1]);
  5. },'hello-world');
  6. echo "<br/>";
  7. $greet = function($name){
  8. printf("Hello%s\r\n",$name);
  9. };
  10.  
  11. $greet('world');
  12. echo "<br/>";
  13. $greet('PHP');
  14.  
  15. $callback = function ($quantity,$product) use ($tax,$total){
  16. $pricePerItem = constant(__CLASS__,"::PRICE".strtoupper($product));
  17. $total += ($pricePerItem * $quantity) * ($tax + 1.0);
  18. };
  19. array_walk($product,$callback);

关于闭包函数的概念可参考:http://bbs.csdn.net/topics/360002529

php不同版本特性记录的更多相关文章

  1. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  2. C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系

    C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 2017年08月06日 11:53:13 阅读数:6705 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有1 ...

  3. Java14版本特性【一文了解】

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  4. Android各版本特性

    此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...

  5. PHP 版本简单记录

    PHP 版本简单记录 PHP 博物馆         http://museum.php.net/php5/ PHP 版本发布       https://secure.php.net/release ...

  6. [转帖]sql server版本特性简介、版本介绍简介

    sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...

  7. docker MySQL官方版本使用记录

    docker MySQL官方版本使用记录 使用记录 拉取官方镜像:docker pull mysql 运行镜像:docker run --name mysql -p 3306:3306 -e MYSQ ...

  8. Python 如何移除旧的版本特性,如何迎接新的特性?

    2020 年 4 月 20 日,Python 2 的最后一个版本 2.7.18 发布了,这意味着 Python 2 是真正的 EOL(end of life)了,一个时代终于落幕了. Python 2 ...

  9. kafka各个版本特性预览介绍

    kafka-0.8.2 新特性 producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率.producer请求会返回一个应答对象,包括偏移量或者 ...

随机推荐

  1. XmlSerializer

    XmlSerializer作用是将对象序列化到 XML 文档中和从 XML 文档中反序列化对象.XmlSerializer 使您得以控制如何将对象编码到 XML 中. 所在的命名空间:System.X ...

  2. asp.net DropDownList实现ToolTip功能

    在绑定DropDownList控件时,可能出现绑定显示的文本过长以至于超过控件长度的内容看不到,这时候就需要使用ToolTip完成其功能,即鼠标放到相应选项后就可显示其完成内容. 首先,在页面引入jQ ...

  3. SQL Server索引进阶:第十三级,插入,更新,删除

    在第十级到十二级中,我们看了索引的内部结构,以及改变结构造成的影响.在本文中,继续查看Insert,update,delete和merge造成的影响.首先,我们单独看一下这四个命令. 插入INSERT ...

  4. MySQL学习笔记(3)

    约束 作用:保证数据的完整性,唯一性 根据字段:分为表级约束(针对2个或者2个以上字段使用),列级约束(针对1个字段使用) 约束类型:NOT NULL 非空约束 PRIMARY KEY  主键约束 U ...

  5. node.js的一些知识

    什么是node.js node.js是构建于chrome浏览器v8引擎上的一个js运行环境 可以解析和执行js代码 可以当做另一种上下文,脱离浏览器环境(后端)运行js代码,而代码解析就是基于V8引擎 ...

  6. 自己定义flash的宽和高

    前段时间做个项目,是个网页的聊天界面,聊天的内容使用flash制作,我需要将flash的swf插件放到页面上,然后获取聊天内容, 1.将文件在页面上显现出来: 如图,正中间使用后台制作出来的swf文件 ...

  7. OpenGL学习之windows下安装opengl的glut库

    OpenGL学习之windows下安装opengl的glut库 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装.  Windows环境下的GLUT下载地址:(大小约为15 ...

  8. 网络技术教程笔记(18)常见广域网技术——X.25与郑中基技术(←_←搜狗输入法你够了)

    广域网与接入网技术 广域网与接入网技术 常见广域网技术--X.25 产生背景 尽管在当时,苹果二代计算机已经取得了很大的成功,但是PC和工作站却没有流行,也没有获得很多的网络支持,大多数人还是使用便宜 ...

  9. javaTemplates-学习笔记一

    第一步,下载Java运行环境-JDK JDK -'1.8.0_25'[附链接地址] 安装JDK配置环境 安装好jdk,然后配置环境变量.不同系统配置环境变量百度Google之,附上WIN8配置方法[J ...

  10. Tomcat与Web服务器、应用服务器的关系

    Tomcat服务器是一个免费的开放源代码的Web应用服务器.因为Tomcat技术先进.性能稳定且免费,所以深受Java爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器. A ...