新特性

使用表達(dá)式定義常量

在之前的 PHP 版本中, 必須使用靜態(tài)值來定義常量,聲明屬性以及指定函數(shù)參數(shù)默認(rèn)值。 現(xiàn)在你可以使用包括數(shù)值、字符串字面量以及其他常量在內(nèi)的數(shù)值表達(dá)式來 定義常量、聲明屬性以及設(shè)置函數(shù)參數(shù)默認(rèn)值。

<?php
const ONE 1;
const 
TWO ONE 2;

class 
{
    const 
THREE TWO 1;
    const 
ONE_THIRD ONE self::THREE;
    const 
SENTENCE 'The value of THREE is '.self::THREE;

    public function 
f($a ONE self::THREE) {
        return 
$a;
    }
}

echo (new 
C)->f()."\n";
echo 
C::SENTENCE;
?>

以上例程會輸出:

4
The value of THREE is 3

現(xiàn)在可以通過 const 關(guān)鍵字來定義類型為 array 的常量。

<?php
const ARR = ['a''b'];

echo 
ARR[0];
?>

以上例程會輸出:

a

使用 ... 運算符定義變長參數(shù)函數(shù)

現(xiàn)在可以不依賴 func_get_args(), 使用 ... 運算符 來實現(xiàn) 變長參數(shù)函數(shù)

<?php
function f($req$opt null, ...$params) {
    
// $params 是一個包含了剩余參數(shù)的數(shù)組
    
printf('$req: %d; $opt: %d; number of params: %d'."\n",
           
$req$optcount($params));
}

f(1);
f(12);
f(123);
f(1234);
f(12345);
?>

以上例程會輸出:

$req: 1; $opt: 0; number of params: 0
$req: 1; $opt: 2; number of params: 0
$req: 1; $opt: 2; number of params: 1
$req: 1; $opt: 2; number of params: 2
$req: 1; $opt: 2; number of params: 3

使用 ... 運算符進(jìn)行參數(shù)展開

在調(diào)用函數(shù)的時候,使用 ... 運算符, 將 數(shù)組可遍歷 對象展開為函數(shù)參數(shù)。 在其他編程語言,比如 Ruby中,這被稱為連接運算符,。

<?php
function add($a$b$c) {
    return 
$a $b $c;
}

$operators = [23];
echo 
add(1, ...$operators);
?>

以上例程會輸出:

6

使用 ** 進(jìn)行冪運算

加入右連接運算符 ** 來進(jìn)行冪運算。 同時還支持簡寫的 **= 運算符,表示進(jìn)行冪運算并賦值。

<?php
printf
("2 ** 3 ==      %d\n"** 3);
printf("2 ** 3 ** 2 == %d\n"** ** 2);

$a 2;
$a **= 3;
printf("a ==           %d\n"$a);
?>

以上例程會輸出:

2 ** 3 ==      8
2 ** 3 ** 2 == 512
a ==           8

use function 以及 use const

use 運算符 被進(jìn)行了擴(kuò)展以支持在類中導(dǎo)入外部的函數(shù)和常量。 對應(yīng)的結(jié)構(gòu)為 use functionuse const

<?php
namespace Name\Space {
    const 
FOO 42;
    function 
f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const 
Name\Space\FOO;
    use function 
Name\Space\f;

    echo 
FOO."\n";
    
f();
}
?>

以上例程會輸出:

42
Name\Space\f

phpdbg

PHP 的 SAPI 模塊中實現(xiàn)了一個 交互式調(diào)試器,叫做 phpdbg。更多信息,請訪問 phpdbg documentation。

默認(rèn)字符編碼

對于一些字符編碼相關(guān)的函數(shù),例如 htmlentities(), html_entity_decode() 以及 htmlspecialchars() 使用 default_charset 作為默認(rèn)字符集。請注意,對于 iconv(現(xiàn)已廢棄) 和 mbstring 相關(guān)的函數(shù), 如果分別設(shè)置了他們的編碼, 那么這些對應(yīng)設(shè)置的優(yōu)先級高于 default_charset。

default_charset 的默認(rèn)值是 UTF-8。

php://input 是可重用的了

只要你需要,你可以多次打開并讀取 php://input。 同時,這個特性使得在處理 POST 的數(shù)據(jù)的時候, 可以明顯降低對于內(nèi)存的需求量。

大文件上傳

現(xiàn)在可以支持大于 2GB 的文件上傳。

GMP 支持運算符重載

GMP 支持運算符重載, 并且造型成數(shù)值類型。 這使得使用 GMP 的代碼更加直觀。

<?php
$a 
gmp_init(42);
$b gmp_init(17);

if (
version_compare(PHP_VERSION'5.6''<')) {
    echo 
gmp_intval(gmp_add($a$b)), PHP_EOL;
    echo 
gmp_intval(gmp_add($a17)), PHP_EOL;
    echo 
gmp_intval(gmp_add(42$b)), PHP_EOL;
} else {
    echo 
$a $bPHP_EOL;
    echo 
$a 17PHP_EOL;
    echo 
42 $bPHP_EOL;
}
?>

以上例程會輸出:

59
59
59

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

加入 hash_equals() 函數(shù), 以恒定的時間消耗來進(jìn)行字符串比較, 以避免時序攻擊。 比如當(dāng)比較 crypt() 密碼散列值的時候,就可以使用此函數(shù)。 (假定你不能使用 password_hash()password_verify(), 這兩個函數(shù)也可以抵抗時序攻擊)

<?php
$expected  
crypt('12345''$2a$07$usesomesillystringforsalt$');
$correct   crypt('12345''$2a$07$usesomesillystringforsalt$');
$incorrect crypt('1234',  '$2a$07$usesomesillystringforsalt$');

var_dump(hash_equals($expected$correct));
var_dump(hash_equals($expected$incorrect));
?>

以上例程會輸出:

bool(true)
bool(false)

__debugInfo()

加入 __debugInfo(), 當(dāng)使用 var_dump() 輸出對象的時候, 可以用來控制要輸出的屬性和值。

<?php
class {
    private 
$prop;

    public function 
__construct($val) {
        
$this->prop $val;
    }

    public function 
__debugInfo() {
        return [
            
'propSquared' => $this->prop ** 2,
        ];
    }
}

var_dump(new C(42));
?>

以上例程會輸出:

object(C)#1 (1) {
  ["propSquared"]=>
  int(1764)
}

gost-crypto 散列算法

加入 gost-crypto 散列算法。 它使用 ? RFC 4357, 11.2 小節(jié) 定義的 CryptoPro S-box 表實現(xiàn)了 GOST 散列函數(shù)。

SSL/TLS 提升

在 PHP 5.6 中對 SSL/TLS 的支持進(jìn)行了大幅度的提升。 這其中包括 默認(rèn)啟用端點驗證 選項來支持證書指紋比對, 以避免 TLS 重新協(xié)商攻擊。 還增加了很多 SSL 上下文選項, 以便在使用加密流的時候, 能夠更好的控制協(xié)議和驗證的相關(guān)設(shè)置。

這些變動在 PHP 5.6.x 中的 OpenSSL 變更 中有詳細(xì)描述。

pgsql 異步支持

pgsql 擴(kuò)展現(xiàn)在支持 異步方式連接數(shù)據(jù)庫及執(zhí)行查詢, 也即可以使用非阻塞的方式和 PostgreSQL 數(shù)據(jù)庫進(jìn)行交互。 使用 PGSQL_CONNECT_ASYNC 常量可以 建立異步連接,pg_connect_poll()pg_socket(), pg_consume_input()pg_flush() 函數(shù) 可以用來處理異步連接和查詢。