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

一:php5.3中的新特性

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

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

3 ) 支持goto语句

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

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

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

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

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

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

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

<?php
namespace Zend\DB\Table
class Select{ }

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

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

<?php
class A{
public static function who(){
echo __CLASS__ ;
}
public static function test(){
self::who();
}
} class B extends A{
public static function who(){
echo __CLASS__;
}
} B::test();
//结果为A

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

<?php
class A{
public static function who(){
echo __CLASS__ ;
}
public static function test(){
// self::who();
static::who();//这里用static实现的延迟静态绑定
}
} class B extends A{
public static function who(){
echo __CLASS__;
}
} B::test();
//结果为B

③支持goto语句

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

<?php
goto a;
echo "Foo";
a:
echo 'Bar';
for($i = 0;$j = 50;$i < 100;$i++){
while($j--){
if($j == 17) goto end;
}
} echo "i = $i";
end:
echo "j hit 17";

④支持闭包、Lambda、Anonymous函数

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

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

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

<?php 

echo preg_replace_callback('/([a-z])/',function($match){
return strtoupper($match[1]);
},'hello-world');
echo "<br/>";
$greet = function($name){
printf("Hello%s\r\n",$name);
}; $greet('world');
echo "<br/>";
$greet('PHP'); $callback = function ($quantity,$product) use ($tax,$total){
$pricePerItem = constant(__CLASS__,"::PRICE".strtoupper($product));
$total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
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. 在cmd中输入ls命令出现“ls不是内部或外部命令解决

    今天在学习sass查看目录遇到cmd输入ls提示不是内部命令 解决方法: 新建一个ls.bat文件 内容为: @echo off dir

  2. 利用虚拟光驱实现 将WINDOWS文件供虚拟机中的UBUNTU共享

    此方法只能实现(至少目前我发现只能这样)将文件传递给虚拟机中的ubuntu 中,供ubuntu系统阅读,拷贝等,但不能将ubuntu中的数据传递给windows. 即:每次更新windows的数据到u ...

  3. JS学习笔记(三)函数

    js中的方法名一般都是首字母小写,其余单词首字母大写的规范. 声明 function 函数名(参数列表) { // 函数体 return 返回值; } 调用 函数名(); (js中花括号喜欢用这种方式 ...

  4. Deep Learning(深度学习)学习笔记整理系列之(二)

    Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...

  5. 关于strcpy的实现.

    #include <stdio.h> #include <stdlib.h> int strlen(const char *str) { ; while(*str++!='\0 ...

  6. SSD常见问题的技术分析

    AHCI对性能的影响 AHCI,全称Advanced Host Controller Interface,即高级主机控制器接口,是一种相比老旧的“IDE虚拟模式”更适合新一代SATA存储设备通信的协议 ...

  7. 注册表与盘符(转victor888文章 )

    转自: http://blog.csdn.net/loulou_ff/article/details/3769479     写点东西,把这阶段的研究内容记录下来,同时也给研究相关内容的同志提供参考, ...

  8. VC++中的类的内存分布(上)(通过强制转换,观察地址,以及地址里的值来判断)

    0.序 目前正在学习C++中,对于C++的类及其类的实现原理也挺感兴趣.于是打算通过观察类在内存中的分布更好地理解类的实现.因为其实类的分布是由编译器决定的,而本次试验使用的编译器为VS2015 RC ...

  9. adb server is out of date. killing... ADB server didn't ACK * failed to star

    The connection to adb is down, and a severe error has occured. [-- :: - HelloOPone] You must restart ...

  10. 深度优先搜索算法(DFS)以及leetCode的subsets II

    深度优先搜索算法(depth first search),是一个典型的图论算法.所遵循的搜索策略是尽可能“深”地去搜索一个图. 算法思想是: 对于新发现的顶点v,如果它有以点v为起点的未探测的边,则沿 ...