php7介绍

安装

实先删除原有的php包:

查找php包

rpm -qa | grep php

删除旧有的php包

rpm -e php包名称

以centos环境为例子,安装php7可以使用它官方自带的包进行安装。安装方法

如果您使用的是nginx,nginx相关的配置需要修改。 

/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需要一致

sudo /etc/rc.d/init.d/php-fpm restart 重启php-fpm解析器

框架性能和升级

框架性能提升

thinkphp3.2能否平滑升级php7?  跑了一遍流程,基本ok。 钱包tp3.2性能对比  7.0版本耗时 

5.5版本耗时 

5.x到7.0的改变

php7中将mysql_*一系列扩展函数移除,然后使用pdo连接mysql。PDO扩展为PHP访问数据库定义了一个轻量级的、一致性的接口,它提供了一个数据访问抽象层,这样,无论使用什么数据库,都可以通过一致的函数执行查询和获取数据 tp开启pdo模式 http://document.thinkphp.cn/manual_3_2.html#connect_db 可变变量。之前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"> 这样的标签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/h

总结

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

联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2024

备案号:京ICP备15003423号-3