zoukankan      html  css  js  c++  java
  • PHP5.5新特性

    详情见:http://www.php.net/manual/zh/migration55.new-features.php

    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 "
    ";
    ?>

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

    那么为什么yield会有这样的效果呢?联想到lua中的yield,这里就算是协程的概念了。在lua语言中,当程序运行到yield的时候,使用协程将上下文环境记录住,然后将程序操作权归还到主函数,当主函数调用resume的时候,会重新唤起协程,读取yield记录的上下文。这样形成了程序语言级别的多协程操作。php 5.5这里的yield也是同样的道理,当程序运行到yield的时候,当前程序就唤起协程记录上下文,然后主函数继续操作,只是php中没有使用如resume一样的关键字,而是“在使用的时候唤起”协程。比如上例中的foreach迭代器就能唤起yield。所以上面的这个例子就能理解了。

    其实照着引用yield来说,好多内部函数,特别是迭代有关的函数应该都有可能进行优化。或许后续会有yield版本和非yield版本的实现同一功能的函数把。

    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
    ";
    }
    ?>

    4、empty() 支持自定义函数了

    之前empty()中的参数是不能为函数的。现在可以了

    <?php
    function foo(){
        return false;
    }
     
    if(empty(foo())){
        echo 11;
    } else {
        echo 12;
    }

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

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

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

    <?php
    namespace NameSpace;
    class ClassName {}
     
    echo ClassName::class;
     
    echo "
    ";
    ?>

    7、增加了opcache扩展

    使用opcache会提高php的性能,你可以和其他扩展一样静态编译(--enable-opcache)或者动态扩展(zend_extension)加入这个优化项。

    静态编译与动态编译的区别
      动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
      静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。

    8、改进 GD

    对 GD 扩展做了多方面的改进,包括:

  • 相关阅读:
    如何使用Eclipse和GCC搭建STM32环境
    增量式pid和位置式PID参数整定过程对比
    webrtc 源码结构
    小米路由器刷Xiaomi Mi WiFi Mini openwrt
    js jQuery 右键菜单 清屏
    沉默的大多数 (王小波)
    kindle书摘-活着-余华-活着不易,珍惜
    kindle书摘-围城-相爱勿相伤
    Nagios系列1,选择
    红楼梦人物关系图,一代大师成绝响,下回分解待何人,kindle读书摘要
  • 原文地址:https://www.cnblogs.com/zl0372/p/php_31.html
Copyright © 2011-2022 走看看