高性能 PHP7 * 新特性

PHP7 具有很多用于编写高性能、高效代码的新特性,同时也剔除了一些历史版本中过时的特性。

类型声明

默认情况下,所有的PHP文件都处于弱类型校验模式。

<?php
// 1:默认值,表示严格类型校验模式,不符则抛 Fatal error
// 0:表示弱类型校验模式。
declare(strict_types=1);

// 规定形参、返回值类型
function sum(int ...$ints):int
{
    return array_sum($ints);
}

print(sum(1,2,3));

存在意义:声明类型之后,使得函数、方法的形参与返回值有所预期,并且省去了对数据类型的检测,提高执行效率。

use 关键字批量声明

PHP 7 可以使用一个 use 从同一个 namespace 中导入类、函数和常量:

// PHP 7 之前版本需要使用多次 use
use some\namespace\ClassA;
use some\namespace\ClassB;
use function some\namespace\fn_a;
use const some\namespace\ConstA;

// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
use some\namespace\{ClassA
    , ClassB as B
    , function fn_a
    , const ConstA
};

存在意义:提高了代码可读性。

匿名类

匿名类可以用来替代一些"用后即焚"的完整类定义,虽然匿名类没有命名,但在内存的引用地址表中为其分配一个全局唯一的名称。

$name = new class(){
    public function __construct()
    {
        // class@anonymous/Users/atong/htdocs/test.php0x104601063
        echo get_class();
    }
};

存在意义:匿名类的一次性任务代码流程对性能提升帮助很大(高性能PHP7 p28)。

不推荐使用老式构造方法

老式的构造函数在PHP7中依然可用,但会产生不被推荐的信息,并且使用 __construct 时,老式的构造函数失效。

class Atong {
    public function Atong(){
        echo "function atong is called";
    }

    public function __construct(){
        echo "function __construct is called";
    }
}

$atong = new Atong();
// function __construct is called

存在意义:统一和规范。

5 Throwable 接口

在PHP 7之前异常可以被截获,但是错误不能被截获。从PHP 7之后,任何完整程序或者一部分中的Fatal错误可以被截获。

try {
    $value = 1 % 0;
} catch (\DivisionByZeroError $e) {
    // TODO::记录日志
}

echo "it's still running .. ";

存在意义:更合理的异常处理。

太空飞船操作符(<=>)

太空船运算符(组合比较符)在比较变量时非常有用。

// 左大于右时:1
echo (1 <=> 0);
// 两边相等时:0
echo (1 <=> 1);
// 右大于左时:-1
echo (1 <=> 2);

存在意义:更少的代码实现更多的事。

null 合并运算符(??)

空合并运算符可以用来取代三元运算与 isset () 函数。

if(isset($_GET["a"]))
    $a = $_GET["a"];
else
    $a = "test";

// 等效
$a = isset($_GET["a"]) ? $_GET["a"] : "test";

// 等效
$a = $_GET['a'] ?? "test";

存在意义:和 ?: 一样,代码更精简。

统一变量语法

$first = ["name" => "second"];
$second = "atong";

// Notice ..
echo $$first["name"];

// atong,php7要求的语法规范
echo ${$first["name"]};

存在意义:规范。

常量数组

// php5.6 开始可以使用 const 关键字声明数组常量
const STORES = ['en','fr','ar'];

// php7 常量数组可以通过 define 函数声明
define("STORES",['en','fr','ar']);

Switch 中的多个默认值

PHP7 之前,多个 default 默认值在 switch语句中是被允许的,PHP7开始,这样的代码会产生 Fatal 级别错误。

存在意义:规范。

Session_start 函数中的选项数组

PHP7 之前,session_start() 函数没有参数需要传递,session 的配置都在 php.ini 中,PHP 7 之后 session_start() 函数可以接收一个数组作为参数,可以覆盖php.ini中session的配置项。

session_start([
   'cache_limiter' => 'private',
   'read_and_close' => true,
]);

Unserialize 函数引入过滤器

通常使用serialize和unserialize两个方法分别对对象进行序列化和反序列化。然而,unserialize()函数并不安全,因为没有任何过滤项,并且可以反序列化任何类型的对象。因此PHP 7引入过滤器,默认情况下允许反序列化所有类型的对象。使用方法如下:

$result = unserilize($object, ['allowed_classes' => ['Packt', 'Books', 'Ebooks']]);

参考:《高性能PHP7,Learning PHP7 High Performance》

发布了46 篇原创文章 · 获赞 42 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/Phplayers/article/details/103571968