zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    解决margin 外边距合并问题
    tsx 校验 以及写法
    tsx 引入文件找不到
    Ubuntu 16.04安装和卸载软件命令
    Java8 中使用Stream 让List 转 Map使用总结
    Java8 Stream流式编程浅析
    浅析IOC 和 DI
    [ Java面试题 ]Java 开发岗面试知识点解析
    Intellij Idea 常用快捷键总结+实用小技巧
    Intellij Idea基础设置
  • 原文地址:https://www.cnblogs.com/EvileOn/p/5251460.html
Copyright © 2011-2022 走看看