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
最新文章
- 为阿里云站点部署免费 HTTPS
- 学习linux/unix编程方法的建议(转)
- favicon.ico文件简介
- 【编程题目】一个整数数组,长度为 n,将其分为 m 份,使各份的和相等,求 m 的最大值★★ (自己没有做出来!!)
- CRC-16/XMODE X16+X12+X5+1 C#、C和java环境下实现
- jquery 简单弹出层
- URAL 2066 Simple Expression (水题,暴力)
- AngularJS - 定时器 倒计时例子
- http状态码对应表
- mysql for linux 数据库的安装过程
- 微信公众账号【iOSDevTip】推出新栏目【看大牛】
- WPS页面设置
- PID教程
- 什么是CALayer
- git忽略文件并删除git仓库中的文件
- 动态生成表格的每一行的操作按钮如何获取当前行的index
- ArrayList中对象 排序
- Vue 波纹按钮组件
- Andriod App类型简介
- 后台跨域(CORS)
热门文章
- poj 1149 PIGS(最大流经典构图)
- NYOJ306 走迷宫(dfs+二分搜索)
- JavaScrtip之JS最佳实践
- C#将图片转化为黑白图片
- Csharp多态的实现(接口)
- BZOJ 1951: [Sdoi2010]古代猪文( 数论 )
- Java学习之字符串练习
- python基础学习笔记4--抽象
- SQL Server 通配符为目标字符的查找
- MYSQL this function has none of deterministic no sql ......错误