php7介绍

### 安装 实先删除原有的php包: ##查找php包 rpm -qa | grep php ##删除旧有的php包 rpm -e php包名称 以centos环境为例子,安装php7可以使用它官方自带的包进行安装。[安装方法](http://tecadmin.net/install-php-7-on-centos/) 如果您使用的是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解析器 ### 框架性能和升级 框架性能提升 ![](/uploads/image/2016/11/06/20161106101157_26599.jpg) thinkphp3.2能否平滑升级php7?  跑了一遍流程,基本ok。 钱包tp3.2性能对比  7.0版本耗时  ![](/uploads/image/2016/11/06/20161106101242_34014.jpg) 5.5版本耗时  ![](/uploads/image/2016/11/06/20161106101216_95217.jpg) ### 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()来执行处理,如果没有默认的异常处理程序,则该异常将被转换为一个致命错误,并且将被像一个传统的错误被处理. 继承关系图:  ![](/uploads/image/2016/11/06/20161106101319_94367.jpg) 代码示例: 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-2022

备案号:京ICP备15003423号-3