专栏首页郑科的专栏PHP7 新特性简介(一)
原创

PHP7 新特性简介(一)

PHP7是PHP编程语言全新的一个版本,在性能方面获得了极大的提升。官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能。同时还提供了很多其他语言流行的语法格式。另外其PHP7的兼容性也是非常好的。因此,其他版本向PHP7迁移过程中,程序调整不会太大。本文不针对性能提升原因做深入研究,主要是简单描述一下PHP7一些新增的特性。

1、函数参数支持标量类型声明

在PHP5中,可以将函数参数指定为类名、接口名、数组和回调类型中的一种,但是无法将类型指定为标量。PHP7中新增了对函数参数声明为四种标量类型的支持,即可以指定参数类型为整型(int)、浮点型(float)、字符串(string)以及布尔型(bool)。

<?php
    //指定函数参数必须为字符串
    function checkOpenid(string $sOpenid)
    {
        return preg_match('/^[a-zA-Z_-]{28}$/', $sOpenid);
    }
?>

2、新增函数返回类型声明

PHP7新增了对函数返回类型声明的支持,支持的类型与参数类型相同(在PHP7.1中支持返回void类型)。

<?php
    //指定函数返回值必须为整型
    function checkOpenid(string $sOpenid): int
    {
        return preg_match('/^[a-zA-Z_-]{28}$/', $sOpenid);
    }
?>

函数参数以及函数返回值支持的类型见下表:

标量的声明有2中模式:1、严格模式;2、强制模式(默认)。可以在文件顶部通过decalre关键字来修改标量声明模式。强制模式下如果值的类型与声明的不符合,PHP会尽量进行转换到对应类型。但是,如果是严格模式下,值与类型不符合,则会出现一个错误。

<?php
     declare(strict_types=1);
    function sum(int $a, int $b): int 
    {
        return $a+$b;
    }
    echo sum(1.1, 3);
?>
# Fatal error: Uncaught TypeError: Argument 1 passed to sum() must be of the type integer, float given

3、define定义常量数组

PHP5.6及以后版本中可以通过const关键字来定义常量数组,PHP7中新增可以通过define定义常量数组功能。


<?php
    //php5.6中通过const定义常量数组
    const FRUITS = ['peach', 'banana', 'pear', 'orange'];

    //php7 中通过define定义常量数组数组
    define('FRUITS1', ['peach','banana','pear','orange']);
?>

4、生成器返回表达式

php5.5中实现了生成器yield,但是生成器函数不可以有返回值,但是return空是一个有效的语法并且它将会终止生成器继续执行。生成器函数只能通过yield关键字来生成值。php7中允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。

5、生成器新增yield from操作符

php7可以在外层生成器中使用 yield from, 就可以把一个生成器自动委派给其他的生成器, Traversable 对象或者 array。


<?php
    function myGenerator() 
    {
        //委派给一个数组
        yield from [1, 2];
        //委派给另外一个生成器函数
        return yield from anotherGenerator();
    }

    function anotherGenerator() 
    {
        yield 3;
        return 4;
    }

    $generator = myGenerator();
    foreach($generator as $val)
    {
        echo $val, PHP_EOL;
    }
    echo $generator->getReturn(); 
?>
#输出结果
# 1
# 2
# 3
# 4

6、NULL合并运算符

后端CGI在接收用户传入的数据时通常会先判断变量是否存在,如果存在获取对应的值,如果不存在,在设置一个默认值或者报错处理。这里就会用到 三元运算符和isset。在PHP7中新增了一个语法糖??。如果第一个操作数存在且不为null则返回第一个操作数的值,否则返回第二个操作数的值。例如:

<?php
    //获取用户openid.先从$_GET中获取,如果没有从$_POST中获取,如果还是不存在,就默认空
    //PHP7之前的写法
    $sOpenid = isset($_GET['iuin']) ? $_GET['iuin'] : (isset($_POST['iuin']) ? $_POST['iuin'] : '');

    //php7中新增的??语法糖
    $sOpenid = $_GET['iuin'] ?? $_POST['iuin'] ?? '';
?>

7、组合比较符

该操作符也称为太空船操作符,用于对2个表达式进行比较并返回比较结果。使用语法:$exp1 <=> $exp2。如果$exp1小于$exp2返回-1,$exp1等于$exp2返回0,$exp1大于$exp2返回1。比较的原则是沿用 PHP 的常规比较规则进行的。

<?php
    echo 10 <=> 9;
    echo 10 <=> 20;
    echo 10 <=> '10';
?>
#输出结果
# 1
# -1
# 0

8、新增Closure::call()静态方法

Closure是用来表示匿名函数的类,可以称作为闭包类。任何一个匿名函数PHP都会自动产生一个Closure类的对象。如果需要复制一个闭包对象且调用它,在PHP7之前版本,写法较为繁琐,而在PHP7可以通过call方法来快速实现。


<?php
    class A 
    {
        private $x = 1;
    }

    // PHP 7 之前版本的代码
    $getXCB = function() 
    {
        return $this->x;
    };

    //复制闭包对象$getXCB,并将该闭包绑定到类A的实例化对象上,“绑定对象”决定了函数中$this的取值
    //本例中$this指向了类A的实例化对象
    $getX = $getXCB->bindTo(new A, 'A');
    echo $getX();

    // PHP 7+ 及更高版本的代码
    $getX = function() 
    {
        return $this->x;
    };
    echo $getX->call(new A);
?>

未了避免篇幅过长,本文没有列举PHP7中所有新特性,其余新特性将在后续文章中陆续补充。

关于文章示例代码说明:本文中代码均在PHP7.1.4版本中进行了测试。部分代码采用了PHP官网代码。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 生成器有什么好处?

    在Python这门语言中,生成器毫无疑问是最有用的特性之一。与此同时,也是使用的最不广泛的Python特性之一。究其原因,主要是因为,在其他主流语言里面没有生成...

    GH
  • 【GAN优化】什么是模式崩溃,以及如何从优化目标上解决这个问题

    今天讲述的内容是GAN中的模式崩溃问题,之前的文章有提到这个问题,在接下来的两三期内,将和大家一起讨论有关模式崩溃的解决方法。

    用户1508658
  • 单张图像就可以训练GAN!Adobe改良图像生成方法 | 已开源

    去年谷歌就提出了SinGAN,是第一个拿GAN在单幅自然图像学习的非条件生成模型(ICCV 2019最佳论文)。

    量子位
  • 云计算成本:4个神话与误解

    如今,企业将业务迁移到云端的趋势很普遍,这样做会为企业CIO及其组织节省成本。当然,企业可以通过将某些工作负载迁移到云计算环境来节省资金。然而,这一误解产生于可...

    静一
  • 当python遇上杨辉三角——生成器与迭代器

    生成器:generator,主要是处理无限大的序列,但不希望采用传统的生成再存储的方式,因为这样极度占用内存与存储空间,因此可以看做是个懒人函数,需要的时候再调...

    小草AI
  • 教你简单快速了解以特币

    一、以特币是否是货币 以特币一定程度来讲就是货币,因为它具有货币的根本属性:是一种交换媒介。只不过它是一种虚拟货币,不是现实中能握在手里的货币,它不具有直接的商...

    企鹅号小编
  • Ubuntu服务器的anaconda环境

    某天在服务器上更新了conda的版本,不知怎么回事我的python3.6就变成python2.7了,而且一进入服务器就会自动进入base环境(我的conda只装...

    py3study
  • Serverless实践系列(十):全新命令行工具帮你快速部署云函数

    SCF CLI 是腾讯云云函数(Serverless Cloud Function,SCF)产品的命令行工具,想必很多小伙伴已经有所了解,或者试用过了。作为一...

    腾讯云serverless团队
  • 使用三阶贝塞尔曲线实现直播中点赞效果

    完整代码,请查看我的github:https://github.com/shuaijia/LiveLike,喜欢的话就给点个赞喽^_^

    蜻蜓队长
  • 这可能是目前最好的图像超分辨率算法,刚刚开源了

    CVPR 2018 Workshop NTIRE2018图像超分辨率的优胜方案开源了! 该算法在NTIRE2018所有三个realistic赛道中全部获得第一名...

    CV君

扫码关注云+社区

领取腾讯云代金券