PHP7 新增特性

一、性能与底层

php7 最显著的变化就是性能的极大提升,PHP7速度是 PHP5.6 的两倍,PHP7在语言上也有一些变化,比如添加返回类型声明、增加了一些新的保留关键字等。在安全方面,去除了PHP安全模式,添加魔术引号等。

二、新特性

1、类型声明

现在php的标量有两种模式: 强制 (默认) 和严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。在旧版中,函数的参数申明只能是(Array $arr)、(CLassName $obj)等,基本类型比如Int,String等是不能够被申明的。

强制模式

php7之前的使用方式:

class MyInfo
{
    public $a = 123;
    public function getInfo(array $a, $b)
    {
        var_dump($a, $b);
    }
}

function getClass(MyInfo $a) {
    var_dump($a->a);
}

强制模式会把数据转换为指定的数据类型

php7使用方式:

class MyInfo
{
    public $a = 123;

    public function get1(bool $b)
    {
        var_dump($b);
    }

    public function get2(int $b)
    {
        var_dump($b);
    }

    public function get3(string $b)
    {
        var_dump($b);
    }

    public function get4(float $b)
    {
        var_dump($b);
    }

    public function get5(array $b)
    {
        var_dump($b);
    }
}

严格模式

<?php
declare(strict_types=1);

就进入严格模式,参数必须符合规定(必须传入指定数据类型的值),不然报错。

2、返回值类型

php7之前的函数是没有返回值类型的,return啥类型,就是啥类型。

php7中增加了返回值类型,return的类型可以是以下这些:bool、int、string、float、array、class。

语法:

function 函数名称() :  返回类型{

}

 

示例:

function returnInfo ($a) : array {
    return $a;
}

var_dump(returnInfo([1,2,3]));

3、null合并运算符 (??)

如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

示例:

//php version = 7
$username = $user ?? 'nobody';

//php  version < 7 得这样使用:
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

注意:

$a ?: $b的意思是 $a为true时,直接返回$a, 否则返回$b

$a ?? $b的意思是 $a isset($a)为true, 且不为NULL, 就返回$a, 否则返回$b。

示例:

$user = 0;

$username = $user ?? 'nobody';

echo $username;  //输出 0,因为 0 存在 且 不为NULL。

$username = $user ?: 'nobody';

echo $username; //输出 'nobody',因为 0 为 false

4、组合比较符

<=>用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。

示例:

// Integers

echo 1 <=> 1; // 0

echo 1 <=> 2; // -1

echo 2 <=> 1; // 1

// Floats

echo 1.5 <=> 1.5; // 0

echo 1.5 <=> 2.5; // -1

echo 2.5 <=> 1.5; // 1

// Strings

echo "a" <=> "a"; // 0

echo "a" <=> "b"; // -1

echo "b" <=> "a"; // 1

5、通过define()定义常量数组

 示例:

define ('AWS' , [12,33,44,55]);

6、匿名类

现在已经支持通过new class 来实例化一个匿名类,这可以用来替代一些用后即焚的完整类定义。

interface Logger {

    public function log(string $msg);

}

class Application {

    private $logger;

    public function getLogger(): Logger {

         return $this->logger;

    }

    public function setLogger(Logger $logger) {

         $this->logger = $logger;

    }

}

$app = new Application;

$app->setLogger(new class implements Logger {

    public function log(string $msg) {

        echo $msg;

    }

});

var_dump($app->getLogger());

7、Unicode codepoint 转译语法

这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的。

echo "\u{0000aa}";

echo "\u{aa}"; //省略了开头的0

echo "\u{9999}";

8、Closure::call() 闭包

class A {private $x = 1;}

// php 7之前:

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

$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure

echo $getX();

// PHP 7:

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

echo $getX->call(new A);

9、为unserialize()提供过滤

现在php7中unserialize会变得更佳好用,它多了一个参数,用来反序列化包涵class的过滤不需要的类,变的更加安全。

10、IntlChar

新增加的 IntlChar(http://php.net/manual/zh/class.intlchar.php) 类旨在暴露出更多的 ICU 功能。这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。

printf('%x', IntlChar::CODEPOINT_MAX);

echo IntlChar::charName('@');

var_dump(IntlChar::ispunct('!'));

 

posted @ 2021-01-07 13:36  样子2018  阅读(434)  评论(0编辑  收藏  举报