php7介绍

Published on 2016 - 11 - 10

1. 安装

  • 首先删除原有的php包:

    ##查找php包
    rpm -qa | grep php
    ##删除旧有的php包
    rpm -e php包名称
    
  • 以centos环境为例子,安装php7以及相关的插件都可以使用它官方自带的包进行安装,查看 安装方法

  • 如果您使用的是nginx,nginx以及php-fpm的配置都需要修改。

    • /etc/php-fpm.d/www.conf 这个php-fpm的启动配置里面, 编辑里面的user和group为www,不然会报403错误。
    • nginx里面的网站配置中 fastcgi_pass 127.0.0.1:9001;/etc/php-fpm.d/www.conf中的监听地址listen = 127.0.0.1:9001需要一致
    • 重启php-fpm解析器 sudo /etc/rc.d/init.d/php-fpm restart

2. 框架性能的提升以及是否支持平滑升级

  • 框架性能提升图表

  • 打开黑魔法,可以进一步提升php7效率, 见参考
  • thinkphp3.2能否平滑升级php7? 自己跑了一遍公司的tp项目,基本ok。没有遇到特殊的bug
  • 项目中的thinkphp3.2版本下的关键接口的性能对比

    • 7.0版本耗时

    • 5.5版本耗时

3. php5.x到php7.0的改变以及解决方案

  • php7中将mysql_*一系列扩展函数移除,然后使用pdo连接mysql。PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据
  • tp支持pdo模式,参见开启办法
  • 可变变量。之前php5.x是按照从右往左解析表达式,建议对于一些有歧义的地方建议使用{}来明确执行顺序,方便迁移到php7.x. php7.x是从左往右解析表达式。

    $first =['a'=>['aa'=>'b']];
    $b = 'lala';
    echo ${$first['a']['aa']};//结果为 lala
    echo $$first['a']['aa'];//php7中无法解析
    
  • call_user_method() 与 call_user_method_array()废除,修改为call_user_function() 与 call_user_method_function() 用法:

    function a($b,$c) 
    { 
        echo $b; 
        echo $c; 
    } 
    call_user_func('a', "111","222"); 
    call_user_func('a', "333","444"); 
    
  • 一些在5.x版本中标记为过时Deprecated的函数,7.x中被删除了

  • <script language="php"></php> 这样的标签php7已经不支持了

  • 静态调用一个非静态方法,会在静态调用中被提示未定义 $this ,并会报错。

    class A {
        public function test() { var_dump($this); }
    }
    
    // Note: Does NOT extend A
    class B {
        public function callNonStaticMethodOfA() { A::test(); }
    }
    
    (new B)->callNonStaticMethodOfA();
    
    //php7中输出
    Deprecated: Non-static method A::test() should not be called statically in /tmp/test.php on line 8
    
    Notice: Undefined variable: this in /tmp/test.php on line 3
    NULL
    
  • 函数参数命名不允许相同。否则会报Fatal error (E_COMPILE_ERROR)。

    function foo($a, $b, $unused, $unused) {
        //
    }
    
  • 预定义变量$HTTP_RAW_POST_DATA(接受POST数据的)被移除,使用占用内存更少的php://input来实现. 接受除了 enctype="multipart/form-data" 类型以外的post请求

  • 严格模式。文件最顶部 declare(strict_type=1); 或者php.ini里面开启。作用于函数调用和返回。strict_types指令只影响指定使用的文件,不会影响被它包含(通过include等方式)进来的其他文件(为了向下兼容)。

  • 添加4种新的标量类型声明:int,float,string和bool (原来的是Closure和类实例). 用于函数的类型检查.

    function sum(int $a, int $b) {
        return $a + $b;
    }
    
    var_dump(sum(1, 2));
    var_dump(sum(1.5, 2.5)); //会报错
    
  • ??操作符

    $username = $_GET['user'] ?? 'nobody';
    等于
    $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
    
  • 太空船操作符 返回1 0 -1

    echo $a <=> $b;
    
  • Array 可以用常亮来define了。PHP5.6 之后仅能通过 const 定义

    define('MYARRAY', ['a'=>1,'b'=>2]);
    
  • use some\namespace{ClassA, ClassB, ClassC as C}; 一次性导入多个相同命名空间的类. 类似es6

  • 可以读取Generator的最终返回值了。Generator里面可以嵌套另一个Generator。

  • 匿名类 用后即焚. new class

    $app->setLogger(new class implements Logger {
        public function log(string $msg) {
            echo $msg;
        }
    });
    
  • 错误(Error)和异常(Exception)处理的变更. Error exceptions会持续冒出直到匹配到对应的catch块。如果没有进行匹配,就会触发被设置的set_exception_handler()来执行处理,如果没有默认的异常处理程序,则该异常将被转换为一个致命错误,并且将被像一个传统的错误被处理. 继承关系图:

    代码示例:

    function add(int $left, int $right) {
        return $left + $right;
    }
    
    try {
        echo add('left', 'right');
    } catch (Exception $e) {
        // Handle exception
    } catch (Error $e) { // Clearly a different type of object
        // Log error and end gracefully
        var_dump($e);
    }

    错误信息如下:
    string(123) "Argument 1 passed to add() must be of the type integer, string given, called in /alidata/www/huxintong/index.php on line 60"

4. 总结

  • 总体感觉php7的执行效率提高很明显,tp被提升了30%左右。
  • 5.x到7.x做到了平滑升级,并贴心的给出了迁移方案。不像python3和python2那样。好的迁移方案是一门语言得以快速发展和升级的前提。
  • 7.x对类型检查和报错信息更加严格和规范了,有点像有静态属性的动态语言。学习了那种强类型语言的特性。
  • 学习了es5, 增加了严格模式的选项。这样喜欢静态特性的人也可以用php7,喜欢动态特性的人可以关掉严格模式。
Comments
Write a Comment