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://www.cnblogs.com/EvileOn/p/5251460.html