zoukankan      html  css  js  c++  java
  • php5.5之后新特性整理

    1 生成器 yield关键字
    yield的中文文档在这里:http://php.net/manual/zh/language.generators.overview.php
    查看文档,能知道yield的一个功能就是能有效的降低迭代的内存开销。比如官网的这个xrange例子:

    <?php 
    function xrange($start, $limit, $step = 1) { 
        for ($i = $start; $i <= $limit; $i += $step) { 
            yield $i; 
        } 
    } 
    
    echo 'Single digit odd numbers: '; 
    
    /* 
     * Note that an array is never created or returned, 
     * which saves memory. 
     */
    foreach (xrange(1, 9, 2) as $number) { 
        echo "$number "; 
    } 
    
    echo "
    "; //输出 Single digit odd numbers: 1 3 5 7 9
    ?> 

    这里的xrange是一个迭代,功能和range是一样的,如果使用range函数的话,那么函数内部实现会储存每个迭代的中间过程,即每个中间变量都有个内存空间,那么首先程序使用的内存空间就大了,而且分配内存,回收内存都会导致程序的运行时间加长。但是如果使用上yield实现的xrange函数的话,里面所有的中间变量都只使用一个内存$i,这样节省的时间和空间都会变小。

    其实迭代的概念早就在PHP有了,但是迭代生成器是PHP的一个新特性,这跟python3中的迭代生成器类似,看看PHP5.5的迭代生成器如何定义。照着引用yield来说,好多内部函数,特别是迭代有关的函数应该都有可能进行优化。或许后续会有yield版本和非yield版本的实现同一功能的函数把。我们再来看个列子:

    <?php
    function xrange($start, $end, $step = 1) {
        for ($i = $start; $i <= $end; $i += $step) {
          yield $i;
        }
    }
    foreach (xrange(1, 1000000) as $num) {
        echo $num, "
    ";
    }

    关键字:yield,正是这个yeild关键字构建了一个迭代器,这个函数xrange跟以往的函数的不同之处就在这里。一般情况都是return一个值,而yield一个值就表示这是个迭代器,每循环一次这个迭代器就生成这个值,故名为迭代生成器,迭代生成器这个函数可以进行foreach循环,每次都产生一个值。

    PHP5.5之前是通过定义类实现Iterator接口的方式来构造迭代器,通过yield构造迭代器将更加提升性能节省系统开销。

    这种方法的优点是显而易见的.它可以让你在处理大数据集合的时候不用一次性的加载到内存中,甚至你可以处理无限大的数据流。

    如上面例子所示,这个迭代器的功能是生成从1到1000000的数字,循环输出,那么使用以往的方式是生成好这1到1000000的数字到数组中,将会十分占用内存,因为是事先就要生成好所有结果,而不是用的时候按需生成,也就是说调用xrange这个迭代器的时候,里面的函数还没有真正的运行,直到你每一次的迭代。

    2 finally关键字
    这个和java中的finally一样,经典的try ... catch ... finally 三段式异常处理。

    3 foreach 支持list()
    对于“数组的数组”进行迭代,之前需要使用两个foreach,现在只需要使用foreach + list了,但是这个数组的数组中的每个数组的个数需要一样。看文档的例子一看就明白了。

    <?php 
    $array = [ 
        [1, 2], 
        [3, 4], 
    ]; 
    
    foreach ($array as list($a, $b)) { 
        echo "a: $a; b: $b
    ";  //输出 a: 1; b: 2 a: 3; b: 4
    } 
    ?> 

    4 empty() 支持自定义函数了
    之前empty()中的参数是不能为函数的。现在可以了

    <?php 
    function foo(){ 
        return false; 
    } 
    
    if(empty(foo())){ 
        echo 'false'; 
    } else { 
        echo 'true';  //输出false
    } 

    5 非变量array和string也能支持下标获取了

    <?php 
    
    echo array(1, 2, 3)[0]; //1
    echo [1, 2, 3][0]; //1
    
    echo "foobar"[2]; //o
    
    ?> 

    6 类名通过::class可以获取

    <?php 
    namespace NameMySpace; 
    class Php7 {} 
    
    echo Php7::class; 
    
    echo "
    "; //输出NameMySpacePhp7
    ?> 

    更多特性陆续整理中.....

  • 相关阅读:
    LG P4213【模板】杜教筛(Sum)
    JZOJ 3447.摘取作物
    JZOJ 3448.公路维护
    JZOJ 4496. 【GDSOI 2016】第一题 互补约数
    jmeter的参数化之函数助手的使用
    window10平台运行jenkins.war的插件安装失败的解决
    jmeter的断言之响应断言的使用
    在虚拟机里安装完mysql后,开启root远程登录权限
    Word Excel PPT 2016从新手到高手
    Oracle 如何停止正在后台执行的impdp/expdp 任务
  • 原文地址:https://www.cnblogs.com/phpper/p/7535716.html
Copyright © 2011-2022 走看看