1. 程式人生 > 實用技巧 >PHP7 新增特性

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('!'));