最近在用php开发时项目中遇到了版本问题,特此记录下php不一样版本的一些特性记录,以备忘。php
一:php5.3中的新特性编程
1)开始支持命名空间(Namespace)缓存
2)支持延迟静态绑定(Late Static Binding)闭包
3 ) 支持goto语句编程语言
4)支持闭包、Lambda/Anonymous函数函数式编程
5)新增了两个魔术方法 __callStatic()和_invoke()函数
6)在类外也可以使用const来定义常量spa
7)支持动态调用静态方法.net
①在5.3以前,惯例的划分Package的办法是经过目录名来分隔代码文件的,代码中的类名则用下划线(_)来表示目录 code
<?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