PHP7--PHP的一次重大变革
PHP7--PHP的一次重大变革
一、写在开头
PHP7是PHP编程语言全新的一个版本,主要在性能方面获得了极大的提升。官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能。同时还对PHP的语法做了梳理,提供了很多其他语言流行的语法格式。难能可贵的是,做了如此大的改动,PHP7的兼容性还是非常好的。对于绝大多数的应用来讲,可以不用做修改即可迁移到PHP7版本。

有人有疑问,为什么没有PHP6就直接PHP7了呢,实际上PHP6这个项目有过,只是后来取消了,但大量的功能已经在PHP5.x版本中得以实现。所以这一次直接就是PHP7。
二、PHP7的安装
使用编译安装太麻烦了,这里提供 Linux下的centos的安装php7的方法:
1)安装epel: yum -y install epel-release
2)更换rpm源,请根据自己的centos版本选择相应的rpm源进行安装:
Centos 5.X:
rpm -Uvhhttp://mirror.webtatic.com/yum/el5/latest.rpmCentOs6.x:
rpm -Uvhhttp://mirror.webtatic.com/yum/el6/latest.rpm
CentOs 7.X:
rpm -Uvhhttps://mirror.webtatic.com/yum/el7/epel-release.rpm
rpm -Uvhhttps://mirror.webtatic.com/yum/el7/webtatic-release.rpm
3)删除之前的php版本:
yum remove php * php-common
4)安装php7: yum install php70w
5)安装成功并检测: php -v
三、PHP7的新特性
1) 标量类型声明: PHP 7 中的函数的形参类型声明可以是标量了,即可以使用 string、int、float和 bool。
php7性能提升了2倍
2)NULL 合并运算符:
同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。
<?php// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值$username = $_GET['user'] ?? 'nobody';// 类似的三元运算符$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';?>4) 太空船操作符(组合比较符)
3)太空船操作符用于比较两个表达式。当$a大于、等于或小于$b时它分别返回-1、0或1。
// 整型echo 1 <=> 1; // 0echo 1 <=> 2; // -1echo 2 <=> 1; // 1
4)通过 define() 定义常量数组
define('ANIMALS', ['dog', 'cat', 'bird']);echo ANIMALS[1]; // 输出 "cat"?>
四、PHP7的修改
1.【 变量处理机制修改】:
间接变量、属性和方法引用都按照从左到右的顺序进行解释:
$$foo['bar']['baz'] // interpreted as ($$foo)['bar']['baz’]
如果想改变解释的顺序,可以使用大括号:${$foo['bar']['baz’]}
global关键字现在只能引用简单变量
global $$foo->bar; // 这种写法不支持。
global ${$foo->bar}; // 需用大括号来达到效果。
引用赋值时自动创建的数组元素或者对象属性顺序和以前不同了。
$array = [];$array["a"] =& $array["b"];$array["b"] = 1;var_dump($array);
PHP7产生的数组:["a" => 1, "b" => 1]
PHP5产生的数组:["b" => 1, "a" => 1]
2.【list()修改】
list()不再按照相反的顺序赋值
list($array[], $array[], $array[]) = [1, 2, 3];var_dump($array);上面的代码会返回一个数组:$array == [1, 2, 3] 而不是之前的 [3, 2, 1]
注意:只是赋值的顺序发生变化,赋的值还是和原来一样的。
空的list()赋值不再允许。
list() = $a;
list()不在支持字符串拆分功能
$string = "xy";
list($x, $y) = $string;
这段代码最终的结果是:$x == null and $y == null (不会有提示)
PHP5运行的结果是: $x = "x" and $y = "y”.
除此之外,list()现在也适用于数组对象:
list($a, $b) = (object) new ArrayObject([0, 1]);
PHP7结果:$a == 0 and $b == 1.
PHP5结果:$a == null and $b == null.
3.【 foreach 修改】
foreach()循环对数组内部指针不再起作用。
$array = [0, 1, 2];foreach ($array as &$val){var_dump(current($array));}
PHP7运行的结果会打印三次int(0),也就是说数组的内部指针并没有改变。
之前运行的结果会打印int(1), int(2)和bool(false)
按照值进行循环的时候,foreach是对该数组的拷贝操作
foreach按照值进行循环的时候(by-value),foreach是对该数组的一个拷贝进行操作。这样在循环过程中对数组做的修改是不会影响循环行为的。
$array = [0, 1, 2];$ref =& $array; // Necessary to trigger the old behaviorforeach ($array as $val) {var_dump($val); unset($array[1]);}
上面的代码虽然在循环中把数组的第二个元素unset掉,但PHP7还是会把三个元素打印出来:(0 1 2)
之前老版本的PHP会把1跳过,只打印(0 2).
按照引用进行循环的时候,对数组的修改会影响循环。
如果在循环的时候是引用的方式,对数组的修改会影响循环行为。不过PHP7版本优化了很多场景下面位置的维护。比如在循环时往数组中追加元素。
$array = [0];foreach ($array as &$val) {var_dump($val); $array[1] = 1;}
上面的代码中追加的元素也会参与循环,这样PHP7会打印"int(0) int(1)",老版本只会打印"int(0)”。
4.【参数处理机制修改】
重复参数命名不再支持
重复的参数命名不再支持。比如下面的代码执行的时候会报错:
public function foo($a, $b, $unused, $unused) {// ...}func_get_arg和func_get_args()调整
func_get_arg()和func_get_args()这两个方法返回参数当前的值,而不是传入时的值。当前的值有可能会被修改
function foo($x){$x++; var_dump(func_get_arg(0));}foo(1);
上面的代码会打印2, 而不是1。如果想打印原始的值,调用的顺序调整下即可。
同样在打印异常回溯信息的时候也是显示修改后的值。
function foo($x){$x = 42; throw new Exception;}foo("string");
PHP7的运行结果:Stack trace:
#0 file.php(4): foo(42)
#1 {main}
PHP5的运行结果:Stack trace:
#0 file.php(4): foo('string')
#1 {main}
这个调整不会影响代码的行为,不过在调试的时候需要注意这个变化。
其他和参数有关的函数都是同样的调整,比如debug_backtrace() .
五、如何升级当前项目代码来兼容PHP7?
逐步剔除php7不支持的代码
检测工具:https://github.com/sstalle/php7cc
检测不兼容PHP7的代码
六、写在最后
PHP7 2倍性能飙升,你心动了吗,赶紧下载代码运行吧~
PHP7--PHP的一次重大变革的更多相关文章
- TODO:macOS编译PHP7.1
TODO:macOS编译PHP7.1 本文主要介绍在macOS上编译PHP7.1,有兴趣的朋友可以去尝试一下. 1.下载PHP7.1源码,建议到PHP官网下载纯净到源码包php-7.1.0.tar.g ...
- 快消品迎来B2B元年,行业将如何变革?
一年接近尾声,又到了年终总结的时候,宴会厅里传来各种激情澎湃的演讲,有的行业遍地开花.欢声笑语不绝于耳:有的行业却没能迎来"昨夜东风",只能嗟叹"不堪回首".2 ...
- 搭建LNAMP环境(七)- PHP7源码安装Memcached和Memcache拓展
上一篇:搭建LNAMP环境(六)- PHP7源码安装MongoDB和MongoDB拓展 一.安装Memcached 1.yum安装libevent事件触发管理器 yum -y install libe ...
- Centos7安装PHP7
安装依赖 yum updateyum install gcc-c++ libxml2 libxml2-devel openssl openssl-devel bzip2 bzip2-devel lib ...
- Ubuntu 16.04 LAMP server 指南 - 配置 Apache2.4,PHP7,和MariaDB(而不是MySQL)
翻译自:https://www.howtoforge.com/tutorial/install-apache-with-php-and-mysql-on-ubuntu-16-04-lamp/ 昨天在虚 ...
- CentOS 7.1编译安装PHP7
原文: https://typecodes.com/web/centos7compilephp7.html?utm_source=tuicool&utm_medium=referral 1 创 ...
- 编译安装PHP7并安装Redis扩展Swoole扩展
编译安装PHP7并安装Redis扩展Swoole扩展 在编译php7的机器上已经有编译安装过php5.3以上的版本,从而依赖库都有了 本php7是编译成fpm-php 使用的, 如果是apache那么 ...
- php7 安装redis扩展
从pecl下载的phpredis扩展在make时报错,google了一下,解决办法,因为phpredis 有专门为php7的分支,所以先git clone phpredis下来 git clone h ...
- 解决升级PHP7后 微信公众号收不到消息
服务器配置Linux+Nginx+PHP5.5+mysql index方法配置微信的关注回复.菜单事件.多客服.自动回复等 public function actionIndex() { if (is ...
随机推荐
- 服务测试碰钉子Server GC
如果发现你的dotnet core服务并发上不去,但cpu资源还比较充足那就要注意了!因为这很有可能是你没有设置一个运行项导致...,下面要提到的就是GC.Server这玩意,实际上项目编译中并没有这 ...
- Chapter 5 Blood Type——4
"Does he mean you?" Jessica asked with insulting astonishment in her voice. “他对你有意思吗?”Jess ...
- 【ASP.NET Core快速入门】(十)Cookie-based认证实现
准备工作 新建MVC项目,然后用VSCode打开 dotnet new mvc --name MvcCookieAuthSample 在Controllers文件夹下新建AdminController ...
- 【WCF系列】(四)WCF客户端怎么消费服务
WCF客户端怎么消费服务 获取服务绑定协议.绑定和地址:实现方式 SvcUtil方式:SvcUtil.exe是一个命令行工具,位于:C:\Program Files (x86)\Microsoft S ...
- 通过钩子程序跨程序关闭Window
需求: 在实际场景中会有自身程序在调用第三方的动态库过程中,因为第三方的动态库弹框导致线程阻塞,必须手动将弹窗关闭后才能回到自身程序的主线程中. 最简单的场景就是很多自助设备,本身是没有固定操作员的, ...
- JaveWeb学习之Servlet(一):Servlet生命周期和加载机制
原文同步发表至个人博客[夜月归途] 原文链接:http://www.guitu18.com/se/java/2018-07-22/19.html 作者:夜月归途 出处:http://www.guitu ...
- Ubuntu18 的超详细常用软件安装
心血来潮,在笔记本安装了Ubuntu 18 用于日常学习,于是有了下面的安装记录. Gnome-Tweak-Tool gnome-tweak-tool可以打开隐藏的设置,可以详细的对系统进行配置,以及 ...
- 第46章 发现端点(Discovery Endpoint) - Identity Server 4 中文文档(v1.0.0)
发现端点可用于检索有关IdentityServer的元数据 - 它返回发布者名称,密钥材料,支持的范围等信息.有关详细信息,请参阅规范. 发现端点可通过/.well-known/openid-conf ...
- 第27章 联合网关 - Identity Server 4 中文文档(v1.0.0)
通用架构是所谓的联合网关.在此方法中,IdentityServer充当一个或多个外部身份提供商的网关. 该架构具有以下优点: 您的应用程序只需要了解一个令牌服务(网关),并且屏蔽了有关连接到外部提供程 ...
- PLSQL创建Oracle定时任务
在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢?下面我简单介绍使用工具创建定时器的方法: 1.创建任务执行的存储过程,如名称为YxtestJob,向测试表中插入数据 cr ...