在之前的 PHP 版本中, 必須使用靜態(tài)值來(lái)定義常量,聲明屬性以及指定函數(shù)參數(shù)默認(rèn)值。 現(xiàn)在你可以使用包括數(shù)值、字符串字面量以及其他常量在內(nèi)的數(shù)值表達(dá)式來(lái) 定義常量、聲明屬性以及設(shè)置函數(shù)參數(shù)默認(rèn)值。
<?php
const ONE = 1;
const TWO = ONE * 2;
class C {
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;
?>
以上例程會(huì)輸出:
4 The value of THREE is 3
現(xiàn)在可以通過(guò) const
關(guān)鍵字來(lái)定義類型為 array 的常量。
<?php
const ARR = ['a', 'b'];
echo ARR[0];
?>
以上例程會(huì)輸出:
a
...
運(yùn)算符定義變長(zhǎng)參數(shù)函數(shù)
現(xiàn)在可以不依賴 func_get_args(),
使用 ...
運(yùn)算符
來(lái)實(shí)現(xiàn) 變長(zhǎng)參數(shù)函數(shù)。
<?php
function f($req, $opt = null, ...$params) {
// $params 是一個(gè)包含了剩余參數(shù)的數(shù)組
printf('$req: %d; $opt: %d; number of params: %d'."\n",
$req, $opt, count($params));
}
f(1);
f(1, 2);
f(1, 2, 3);
f(1, 2, 3, 4);
f(1, 2, 3, 4, 5);
?>
以上例程會(huì)輸出:
$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
...
運(yùn)算符進(jìn)行參數(shù)展開(kāi)
在調(diào)用函數(shù)的時(shí)候,使用 ...
運(yùn)算符,
將 數(shù)組 和
可遍歷 對(duì)象展開(kāi)為函數(shù)參數(shù)。
在其他編程語(yǔ)言,比如 Ruby中,這被稱為連接運(yùn)算符,。
<?php
function add($a, $b, $c) {
return $a + $b + $c;
}
$operators = [2, 3];
echo add(1, ...$operators);
?>
以上例程會(huì)輸出:
6
**
進(jìn)行冪運(yùn)算
加入右連接運(yùn)算符 **
來(lái)進(jìn)行冪運(yùn)算。
同時(shí)還支持簡(jiǎn)寫(xiě)的
**=
運(yùn)算符,表示進(jìn)行冪運(yùn)算并賦值。
<?php
printf("2 ** 3 == %d\n", 2 ** 3);
printf("2 ** 3 ** 2 == %d\n", 2 ** 3 ** 2);
$a = 2;
$a **= 3;
printf("a == %d\n", $a);
?>
以上例程會(huì)輸出:
2 ** 3 == 8 2 ** 3 ** 2 == 512 a == 8
use function
以及 use const
use
運(yùn)算符
被進(jìn)行了擴(kuò)展以支持在類中導(dǎo)入外部的函數(shù)和常量。
對(duì)應(yīng)的結(jié)構(gòu)為 use function
和 use 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();
}
?>
以上例程會(huì)輸出:
42 Name\Space\f
PHP 的 SAPI 模塊中實(shí)現(xiàn)了一個(gè) 交互式調(diào)試器,叫做 phpdbg。更多信息,請(qǐng)?jiān)L問(wèn) phpdbg documentation。
對(duì)于一些字符編碼相關(guān)的函數(shù),例如 htmlentities(), html_entity_decode() 以及 htmlspecialchars() 使用 default_charset 作為默認(rèn)字符集。請(qǐng)注意,對(duì)于 iconv(現(xiàn)已廢棄) 和 mbstring 相關(guān)的函數(shù), 如果分別設(shè)置了他們的編碼, 那么這些對(duì)應(yīng)設(shè)置的優(yōu)先級(jí)高于 default_charset。
default_charset 的默認(rèn)值是 UTF-8
。
php://input
是可重用的了
只要你需要,你可以多次打開(kāi)并讀取
php://input
。
同時(shí),這個(gè)特性使得在處理 POST 的數(shù)據(jù)的時(shí)候,
可以明顯降低對(duì)于內(nèi)存的需求量。
現(xiàn)在可以支持大于 2GB 的文件上傳。
GMP 支持運(yùn)算符重載, 并且造型成數(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($a, 17)), PHP_EOL;
echo gmp_intval(gmp_add(42, $b)), PHP_EOL;
} else {
echo $a + $b, PHP_EOL;
echo $a + 17, PHP_EOL;
echo 42 + $b, PHP_EOL;
}
?>
以上例程會(huì)輸出:
59 59 59
加入 hash_equals() 函數(shù), 以恒定的時(shí)間消耗來(lái)進(jìn)行字符串比較, 以避免時(shí)序攻擊。 比如當(dāng)比較 crypt() 密碼散列值的時(shí)候,就可以使用此函數(shù)。 (假定你不能使用 password_hash() 和 password_verify(), 這兩個(gè)函數(shù)也可以抵抗時(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));
?>
以上例程會(huì)輸出:
bool(true) bool(false)
__debugInfo()
加入 __debugInfo(), 當(dāng)使用 var_dump() 輸出對(duì)象的時(shí)候, 可以用來(lái)控制要輸出的屬性和值。
<?php
class C {
private $prop;
public function __construct($val) {
$this->prop = $val;
}
public function __debugInfo() {
return [
'propSquared' => $this->prop ** 2,
];
}
}
var_dump(new C(42));
?>
以上例程會(huì)輸出:
object(C)#1 (1) { ["propSquared"]=> int(1764) }
加入 gost-crypto
散列算法。
它使用
? RFC 4357, 11.2 小節(jié) 定義的
CryptoPro S-box 表實(shí)現(xiàn)了 GOST 散列函數(shù)。
在 PHP 5.6 中對(duì) SSL/TLS 的支持進(jìn)行了大幅度的提升。 這其中包括 默認(rèn)啟用端點(diǎn)驗(yàn)證 選項(xiàng)來(lái)支持證書(shū)指紋比對(duì), 以避免 TLS 重新協(xié)商攻擊。 還增加了很多 SSL 上下文選項(xiàng), 以便在使用加密流的時(shí)候, 能夠更好的控制協(xié)議和驗(yàn)證的相關(guān)設(shè)置。
這些變動(dòng)在 PHP 5.6.x 中的 OpenSSL 變更 中有詳細(xì)描述。
pgsql 擴(kuò)展現(xiàn)在支持
異步方式連接數(shù)據(jù)庫(kù)及執(zhí)行查詢,
也即可以使用非阻塞的方式和 PostgreSQL 數(shù)據(jù)庫(kù)進(jìn)行交互。
使用 PGSQL_CONNECT_ASYNC
常量可以
建立異步連接,pg_connect_poll(),
pg_socket(),
pg_consume_input() 和 pg_flush() 函數(shù)
可以用來(lái)處理異步連接和查詢。