设为首页 收藏本站
查看: 785|回复: 0

[经验分享] 【PHP系列】PHP 7.0新增特性详解

[复制链接]

尚未签到

发表于 2017-12-29 14:32:30 | 显示全部楼层 |阅读模式
  开始介绍PHP7.0新特性,具体的可以参照官网的介绍,我来挑一些给大家详细讲解下

http://php.net/manual/en/migration70.new-features.php

1. ?? 运算符(NULL 合并运算符)
  

$a = $_GET['a'] ?? 1;  

  它相当于:
  

$a = empty($_GET['a']) ? 1 : $_GET['a'];  

  我们知道三元运算符是可以这样用的:
  

$a ?: 1  

  但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。简化代码的同时也更直观了!

2. 函数返回值类型声明
  官方文档提供的例子(注意 ... 的边长参数语法在 PHP 5.6 以上的版本中才有):
  

<?php  

function arraysSum(array ...$arrays): array  
{
return (function(array $array): int {return ($array);  }
, $arrays);  
}
  

  

(arraysSum([1,2,3], [4,5,6], [7,8,9]));  

  从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。
  这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。
  不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。
  使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。
  强制模式:
  

<?php  

function foo($a) : int  
{
return $a;  
}
  

  
foo(
1.0);  

  以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。
  严格模式:
  

<?php  

declare(strict_types=1);  

  

function foo($a) : int  
{
return $a;  
}
  

  
foo(
1.0);  

  在声明之后,就会触发致命错误。
  

# PHP Fatal error:  Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6  


3. 标量类型声明
  PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。
  

<?php  

// Coercive mode  
function sumOfInts(int ...$ints)
  
{
  return ($ints);
  
}
  

  
(sumOfInts(2, '3', 4.1));
  

  需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

4. use 批量声明
  PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:
  

<?php  

use some\namespace\{ClassA,>
use function some\namespace\{fn_a, fn_b, fn_c};  

use const some\namespace\{ConstA, ConstB, ConstC};  

  但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import * 的方法)。
  需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。
  再来简单说几个:
  1、PHP 5.3 开始有了匿名函数,现在又有了匿名类了;
  2、define 现在可以定义常量数组;
  3、闭包( Closure)增加了一个 call 方法;
  4、生成器(或者叫迭代器更合适)可以有一个最终返回值(return),也可以通过 yield from 的新语法进入一个另外一个生成器中(生成器委托)。
  生成器的两个新特性(return 和 yield from)可以组合。具体的大家可以自行测试。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429362-1-1.html 上篇帖子: PHP集成环境自定义设置PHP版本,同时运行多个php版本,700个PHP版本随时切换,一键开启常用模块。 下篇帖子: PHP的生成器、yield和协程
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表