最近在用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