PHP 各個版本新特性總結

Zhengkx發表於2019-10-30

閒來無事,就想著總結一下各個版本特性。然後就有下面的文件

PHP 5.6 新特性

使用表達定義常量

在之前的版本里,必須使用靜態值來定義常量,宣告屬性以及制定函式引數預設值。

現在當前版本可以使用包括數值、字串以及其他常量的數值表示式來定義常量。

<?php

const ONE = 1;

const TWP = ONE * 2;

echo TWP;

### PHP5.5
# PHP Parse error:  syntax error, unexpected '*'

### 在之後版本
# 2

使用 ** 進行運算

加入右連線運算子 ** 來進行運算,還支援簡寫的 **= 運算子,表示進行冪運算並賦值

<?php
$a = 2;

$b = 2 ** 3;

echo $a **= 4;
echo "\r\n";
echo 2 ** 3 ** 2;
echo "\r\n";
echo $b;

### 輸出
16
512
8

這裡講一下:2 ** 3 ** 2 這個表示式,先給後面的 3 ** 2 進行冪運算,然後才是給前面的進行運算

use function 以及 use const

use 運算子被進行了擴充套件,支援了在類中匯入外部的函式和常量,對應的結構:use functionuse const

<?php
    namespace App {
        const FOO = 1;

        function test()
        {
            echo __FUNCTION__ . "\n";
        }
    }

    namespace {
        use const App\FOO;
        use function App\test;

        echo FOO."\r\n";
        test();
    }

### 輸出
1
App\test

php://input 是可重用的

只要你需要,你可以多次開啟並讀取 php://input

大檔案上傳

現在可以支援大於2GB的檔案上傳

GMP 支援運算子過載

GMP 支援運算子過載,並且造型成數值型別。

GMP是The GNU MP Bignum Library,是一個開源的數學運算庫,它可以用於任意精度的數學運算,包括有符號整數、有理數和浮點數。它本身並沒有精度限制,只取決於機器的硬體情況。

使用 hash_equals() 比較字串避免時序攻擊

加入 hash_equals() 函式,以恆定的時間消耗來進行字串比較,以避免時序攻擊。比如當比較 crypt() 密碼三列值的時候,就可以使用此函式。(password_hash()password_verify() 也可以抵抗時序攻擊)

時序攻擊: 屬於側通道攻擊/旁路攻擊(Side Channel Attack),側通道攻擊是指利用通道外的資訊,比如加解密的速度/加解密時晶片引腳的電壓/密文傳輸的流量和途徑等進行攻擊的方式,一個詞形容就是“旁敲側擊” 。

舉一個最簡單的計時攻擊的例子,某個函式負責比較使用者輸入的密碼和存放在系統內密碼是否相同,如果該函式是從第一位開始比較,發現不同就立即返回,那麼透過計算返回的速度就知道了大概是哪一位開始不同的,這樣就實現了電影中經常出現的按位破解密碼的場景。密碼破解複雜度成千上萬倍甚至百萬千萬倍的下降。

pgsql 非同步支援

pgsql 擴充套件現在支援非同步方式連線資料庫及執行查詢,也可以使用非阻塞的方式和 PostgreSQL 資料庫進行互動。

PHP 7.0 新特性

標量型別宣告

標量 型別宣告 有兩種模式:強制(預設)嚴格模式 。現在可以使用:字串、整數、浮點數、布林值。她們擴充了 PHP5 中引入的其他型別:類名、介面、陣列和回撥型別。

<?php
    function sumOfInts(int ...$ints)
    {
        return array_sum($ints);
    }

    var_dump(sumOfInts(2, '3', 4.1));

### 輸出
int(9)

返回值型別宣告

PHP7 增加了對返回型別宣告的支援。指明瞭函式返回值的型別。

<?php
function arraysSum(array ...$arrays): array
{
    return array_map(function (array $array): int {
        return array_sum($array);
    }, $arrays);
}

print_r(arraysSum([1, 2, 3], [4, 5, 6]));

### 輸出
Array
(
    [0] => 6
    [1] => 15
)

null合併運算子

日常使用中存在大量同時使用三元表示式和 isset() 的情況,PHP7 新增了null合併運算子(??) 。如果變數存在且值不為 NULL ,它就會返回自身的值,否則返回他的第二個運算元

<?php
$username = $_GET['user'] ?? 'nobody';

echo $username;

##### 輸出
nobody

太空船運算子(組合比較符)

太空船運算子用於比較兩個表示式。當 $a 小於、等於或者大於 $b 時他分別返回 -1、0 或 1。

<?php
# 整數
echo 1 <=> 2;  // -1
echo 1 <=> 1;  // 0
echo 2 <=> 1;  // 1

# 浮點數
echo 1.5 <=> 2.5;  // -1
echo 1.5 <=> 1.5;  // 0
echo 2.5 <=> 1.5;  // 1

# 整數
echo "a" <=> "b";  // -1
echo "a" <=> "a";  // 0
echo "b" <=> "a";  // 1

透過 define() 定義常量陣列

Array 型別的常量現在可以透過 define() 來定義。在 PHP 5.6 中僅能透過 const 定義。

<?php
define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[2];

### 輸出
bird

Closure::call()

Closure::call() 有著更好的效能,剪短幹練的暫時繫結一個方法到物件上閉包並呼叫它。

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

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

$getX = $getXCB->bindTo(new A, 'A'); // 中間層閉包

// PHP 7+ 
$getX = function() {
    return $this->x;
};

echo $getx->call(new A);

為 unserialize() 提供過濾

這個特性旨在提供更安全的方式解包不可靠的資料。他透過白名單的方式來防止潛在的程式碼注入。

預期

預期 是向後兼用並增強之前的 assert() 的方法。它使得在生產環境中啟用斷言為零成本,並提供斷言失敗時丟擲特定異常的能力。

<?php
ini_set('assert.exception', 1);

class CustomError extends AssertionError() {}

assert(false, new CustonError('some error message'));

Group use declarations

從同一個 namespace 匯入的類、函式和常量現在可以透過單個 use 語句一次性匯入。

<?php

use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

整數除法函式 intdiv()

新加的函式 intdiv() 用來進行整數的除法運算

<?php

var_dump(intdiv(10, 3));

### 輸出
int(3)

會話選項

session_start() 可以接受一個 array 作為引數,用來覆蓋 php.ini 檔案中設定的會話配置選項

CSPRNG Functions

新加入兩個跨平臺的函式:random_bytes()random_int() 用來產生高安全級別的隨機字串和隨機整數。

<?php
$bty = random_bytes(4);

var_dump(bin2hex($bty));

$ints = random_int(1, 1000);

var_dump($ints);

### 輸出
string(8) "093a14a4"
int(746)

bin2hex() - 函式把包含資料的二進位制字串轉換為十六進位制值

可以使用 list() 函式來展開實現了 ArrayAccess 介面的物件

PHP 7.1 新特性

可為空(Nullable)型別

引數以及返回值的型別現在可以透過在型別前加上一個問號使之允許為空。當啟用這個特性時,傳入的引數或者函式返回的結果要麼是給定的型別,要麼是 null。

<?php
function testReturn(): ?string
{
    return 'elePhPant';
}

var_dump(testReturn());

function testReturn1(): ?string
{
    return null;
}

var_dump(testReturn1());

function test(?string $name)
{
    var_dump($name);
}

test('elePHPant');
test(null);
test();

### 輸出
string(9) "elePhPant"
NULL
string(9) "elePHPant"
NULL
PHP Fatal error:  Uncaught ArgumentCountError: Too few arguments to function test(), 0 passed

void 函式

一個新的返回值型別 void 被引入。返回值宣告為 void 型別的方法要麼乾脆省去 return 語句,要麼使用一個空的 return 語句。對於 void 函式來說,NULL 不是一個合法的返回值

Symmetric array destructuring

短陣列語法([])現在作為 list() 語法的一個備選項,可以用於將陣列的值賦給一些變數(包括在 foreach 中)。

<?php
$data = [
    [1, 'Tom'],
    [2, 'Fred']
];

// 使用 list()
list($id1, $name1) = $data[0];

foreach($data as list($ids, $name)) {

}

// 使用 []
[$id1, $name1] = $data[0];

foreach($data as [$id, $name]) {

}

類常量可見性

現在起支援設定類常量的可見性。

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

list() 現在支援鍵名

現在 list() 和它的新的 [] 語法支援在它內部指定鍵名。

多異常捕獲處理

一個 catch 語句塊現在可以透過管道字元 (/)來實現多個異常的捕獲。

<?php
try {

} catch (FirstException | SecondException $e) {

}

支援為負的字串偏移量

現在所有支援偏移量的 字串操作函式 都支援接收負數作為偏移量,包括透過 []{} 操作字串下標。在這種情況下,一個負數的偏移量會被理解為一個從字串結尾開始的偏移量

<?php
var_dump("abcdef"[-2]);
var_dump(strpos("aabbcc", 'b', -3));

### 輸出
string(1) "e"
int(3)

PHP 7.2 新特性

這個版本感覺官方好像偷懶了哈哈哈

新的物件型別

這種新的物件型別,object ,引進了可用於 逆變( contravariant )引數輸入和 協變(covariant)返回任務物件型別。

<?php
function test(object $obj) :object
{
    return new SqlQueue();
}

test(new StdClass());

透過名稱載入擴充套件

擴充套件檔案不再需要透過檔案載入進行指定。可以在 php.ini 配置檔案進行啟用,也可以使用 dl() 函式進行啟用。

<?php
if (!extension_loaded('sqlite')) {
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        dl('php_sqlite.dll');
    } else {
        dl('sqlite.so');
    }
} 

允許重寫抽象方法(Abstract method)

當一個抽象類繼承於另外一個抽象類的時候,繼承後的抽象類可以重寫被繼承的抽象類的抽象方法。

<?php
abstract class A
{
    abstract function test(string $s);
}

abstract class B extends A
{
    abstract function test($s) :int;
}

使用 Argon2 演算法生成密碼雜湊

暴露出來的常量

  • PASSWORD_ARGON2I
  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

新增 ext/PDO (PDO擴充套件)字串擴充套件型別

擴充套件的常量

  • PDO::PARAM_STR_NATL
  • PDO::PARAM_STR_CHAR
  • PDO::ATTR_DEFAULT_STR_PARAM

為 ext/PDO 新增額外的模擬除錯資訊

ext/PDP (LDAP擴充套件)支援新的操作方式

暴露的函式和常量

ext/sockets(sockets擴充套件)新增了地址資訊

新增的函式

允許分組名稱空間的尾部逗號

<?php
use Foo\Bar\{
    Foo,
    Bar,
    Baz,
}

。。。。。

PHP7.3、、、PHP7.4。。。官方還沒有給出中文文件所以

之後跟進

文件參考: PHP官方文件

本作品採用《CC 協議》,轉載必須註明作者和本文連結
好好管教自己,不要管別人

相關文章