骑驴找蚂蚁

全干工程师

PHP7常用新特性和函数

距离php7发布也有好几年了,而国内大部分空间商和CMS系统还在使用5.2的时代。 最近正好也在升级公司的项目到7上面,其实在升级到7的时候代码改动很小,不得不说php的向下兼容性很强官方也在这方面下了不少功夫。下面就说说php7中的一些常用新特性。

标量参数和返回类型声明

PHP在版本7之前有类型声明,但仅限于对象和数组。 PHP7现在为表中的所有标量类型提供支持,并提供两种不同类型的声明。 此特性在开发大型工程借助IDE的情况下还是很有帮助的,对程序性能也有提升。

强制:

这是默认声明类型,只是意味着PHP运行时将在需要时尝试强制值。以下面的代码为例。

<?php

function testTypeDeclaration(string $argument): string 
{
    return strrev($argument);
}

var_dump(testTypeDeclaration(1234));

我们指定参数$argumentstring类型以及返回值。正如你看到的那样, 代码并没有出错如期的运行着。
当我们传入数字1234时,它只是被强制转换成'1234'字符串并且没有错误发生。

严格:

严格模式它是通过添加到每个文件顶部的标志逐个文件启用的。启用时,它不会像上面的示例中那样强制转换类型,而是响应错误并停止执行脚本。

<?php

declare(strict_types=1);

function testTypeDeclaration(string $argument): string 
{
    return strrev($argument);
}

var_dump(testTypeDeclaration(1234));

declare(strict_types=1)标志必须写在文件的顶部

通过严格模式这段代码会得到以下的错误:


Fatal error: Uncaught TypeError: Argument 1 passed to testTypeDeclaration() must be of the type string, integer given

null合并运算符

此项特性会为我们节省很多if代码段. 也是新特性中用处最多的,代码更简洁。在日常使用中我们大量同时使用三元表达式和isset()的情况,使用该特性就可以直接代替isset和三元表达式,这是一个语法糖特性.

<?php

echo isset($_GET['user']) ? $_GET['user'] : 'nobody'; // php7之前


echo $_GET['user'] ?? 'nobody'; // php7之后

?? 如果前的表达式为null就会使用??后面的值否则返回自身.

常量数组

在7之前常量是只支持标量的,升级到7就可以支持常量数组.

<?php

define('COLORS', [
    'red' => '#f44141',
    'blue' => '#4286f4',
    'green' => '#1ae01e',
    'purple' => '#f309f7',
    'orange' => '#ef7700',
]);

echo COLORS['red']; // 输出 "#f44141"

class Test 
{
    const ANIMALS = [ // 这个在5.6就已经支持了
        'dog',
        'cat',
        'bird'
    ];
}

echo Test::ANIMALS[0]; // 输出 "dog"

Namespace组声明

在同一namespace下的类、函数和常量现在可以通过单个use语句一次性导入了。

<?php
// 7之前
use Group/Child/ClasName1;
use Group/Child/ClasName2;
use Group/Child/ClasName3;

// 7之后

use Group/Child/{ClassName1, ClassName2, ClassName3};

匿名类

使用new class可以直接实例化一个匿名类,有些可能并不需要一些实体类.

<?php

interface Car
{
    public function getName();
}

class App
{
    private $car = null;

    public function setCar(Car $car)
    {
        $this->car = $car;
    }

    public function getName()
    {
        echo $this->car->getName();
    }
}

echo (new App)->setCar(new class implements Car {
    public function getName()
    {
        return "police car";
    }
})->getName();

正如你看到的,上面的示例会输出police car字符串。

其它的一些不常用的特性就不做介绍了,可以通用官方提供的文档来查看全部特性.

新增加函数

random_int

函数生成加密安全的伪随机整数,官方文档

<?php

echo randome_int(1, 13);

random_bytes

函数生成加密安全的伪随机字节,官方文档, 此函数在密钥随机生成时候非常有用。

<?php
$bytes = random_bytes(5);
echo bin2hex($bytes);

Closure::call()

将闭包暂时绑定到新对象中,并调用闭包.

<?php

class A {private $x = 1;}

$getX = function() {return $this->x;};

echo $getX->call(new A); // 输出 1;

总结

在升级到7之后,上面这些新特性和函数是我在项目中常用的一些功能,本文还有很多未介绍的特性功能,大家可以去官方文档阅读更多的内容。强烈建议大家升级到7,不管在性能,代码质量,安全性都要比上个版本好很多。大家也可以通过留言和我一起探讨其它的问题,谢谢大家。

留言