php不同版本特性记录
最近在用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不同版本特性记录的更多相关文章
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- 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 ...
- Java14版本特性【一文了解】
「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...
- Android各版本特性
此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...
- PHP 版本简单记录
PHP 版本简单记录 PHP 博物馆 http://museum.php.net/php5/ PHP 版本发布 https://secure.php.net/release ...
- [转帖]sql server版本特性简介、版本介绍简介
sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...
- docker MySQL官方版本使用记录
docker MySQL官方版本使用记录 使用记录 拉取官方镜像:docker pull mysql 运行镜像:docker run --name mysql -p 3306:3306 -e MYSQ ...
- Python 如何移除旧的版本特性,如何迎接新的特性?
2020 年 4 月 20 日,Python 2 的最后一个版本 2.7.18 发布了,这意味着 Python 2 是真正的 EOL(end of life)了,一个时代终于落幕了. Python 2 ...
- kafka各个版本特性预览介绍
kafka-0.8.2 新特性 producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率.producer请求会返回一个应答对象,包括偏移量或者 ...
随机推荐
- HTML之学习笔记(十)表单元素
html表单元素的基本格式为(必须包含在form标签中)
- Deep Learning(深度学习)学习笔记整理系列之(三)
Deep Learning(深度学习)学习笔记整理系列 zouxy09@qq.com http://blog.csdn.net/zouxy09 作者:Zouxy version 1.0 2013-04 ...
- VS2010 打包问题汇总
问题1:打包时:应将msadox28.tlb排除 ,受到windows系统文件保护 解决方案:文件选项上,选择排除即可. 问题2:路径有文件,生成报错,提示找不到文件或文件被锁定. 解决方案:文件被锁 ...
- java项目打jar包
首先 在工程中,右键项目,有个export,选择JAR File,就能导出jar包. 一.java项目没有导入第三方jar包 1. 首先在Eclipse中打开项目, 右键点击项目,选择“Export” ...
- memcached look status
$ STAT pid STAT STAT STAT version STAT pointer_size STAT rusage_user 7.054927 STAT rusage_system 14. ...
- html object元素
知道object是播放音频,但是想了解具体点,百度一下,感觉模模糊糊的,感觉看不大明白,最后找到一个解释比较详细,先从应用,到解释具体属性, 具体网址是: http://www.w3school.co ...
- 《JavaScript+DOM编程艺术》的摘要(三)---图片库实例
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- hdu 3397 Sequence operation 线段树
题目链接 给出n个数, 每个数是0或1, 给5种操作, 区间变为1, 区间变为0, 区间0,1翻转, 询问区间内1的个数, 询问区间内最长连续1的个数. 需要将数组开成二维的, 然后区间0, 1翻转只 ...
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=armv7 armv7s)
In Build Settings are: Architectures: Starndard (armv7, armv7s) Base SDK: Latest iOS (iOS 6.0) Build ...
- java调用C++ DLL库方法
最近一个项目要开发网页端人脸识别项目,人脸识别的算法已经写好,是C++版,但是网页端要求使用Java后台,这就涉及到Java调用DLL的问题.经过查找,实现了一个简单的例子. 1.第一步,先在Java ...