2024 PHP Conference Japan

新功能

常數運算式

現在可以在 PHP 先前需要靜態值的地方(例如常數和屬性宣告以及預設函式引數)提供涉及數字和字串字面值及/或常數的純量運算式。

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

class
C {
const
THREE = TWO + 1;
const
ONE_THIRD = ONE / self::THREE;
const
SENTENCE = 'THREE 的值是 '.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

現在也可以使用 const 關鍵字定義常數 陣列

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

echo
ARR[0];
?>

上述範例將輸出

a

透過 ... 的可變參數函式

可變參數函式 現在可以使用 ... 運算子來實作,而不需依賴 func_get_args()

<?php
function f($req, $opt = null, ...$params) {
// $params 是一個包含其餘參數的陣列。
printf('$req: %d; $opt: %d; 參數數量: %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);
?>

上述範例將輸出

$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

透過 ... 展開參數

呼叫函式時,可以使用 ... 運算子將陣列Traversable 物件展開到參數列表中。這在其他語言(包括 Ruby)中也稱為 splat 運算子。

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

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

上述範例將輸出

6

透過 ** 進行指數運算

新增了右結合 ** 運算子以支援指數運算,以及 **= 簡寫賦值運算子。

<?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);
?>

上述範例將輸出

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

使用 `use function` 和 `use const`

use 運算子已擴展,除了類別之外,現在也支援導入函式和常數。這分別是透過 `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();
}
?>

上述範例將輸出

42
Name\Space\f

phpdbg

PHP 現在包含一個名為 phpdbg 的互動式除錯器,它以 SAPI 模組的形式實作。更多資訊,請參閱 phpdbg 文件

預設字元編碼

default_charset 現在被用作 htmlentities()html_entity_decode()htmlspecialchars() 函式的預設字元集。請注意,如果設定了(現在已棄用)的 iconv 和 mbstring 編碼設定,它們將分別優先於 iconv 和 mbstring 函式的 default_charset。

此設定的預設值為 UTF-8

php://input 可重複使用

php://input 現在可以根據需要重新開啟和讀取多次。這項工作還大幅減少了處理 POST 資料所需的記憶體量。

大型檔案上傳

現在接受大於 2 GB 的檔案。

GMP 支援運算子多載

GMP 物件現在支援運算子多載和轉換為純量類型。這允許使用 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;
}
?>

上述範例將輸出

59
59
59

使用 hash_equals() 進行防止計時攻擊的安全字串比較

hash_equals() 函式已被加入用於以固定時間比較兩個字串。這應該用於減輕計時攻擊;例如,在測試 crypt() 密碼雜湊值時(假設您無法使用 password_hash()password_verify(),它們不易受計時攻擊的影響)。

<?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(),允許物件在使用 var_dump() 輸出時更改顯示的屬性和值。

<?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));
?>

上述範例將輸出

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

gost-crypto 雜湊演算法

新增了 gost-crypto 雜湊演算法。它使用 CryptoPro S-box 表實現了 GOST 雜湊函數,詳見 » RFC 4357,第 11.2 節

SSL/TLS 的改進

PHP 5.6 對 SSL/TLS 支援進行了廣泛的改進。這些改進包括預設啟用 peer 驗證、支援憑證指紋比對、降低 TLS 重新協商攻擊的風險,以及許多新的 SSL 內容選項,以便在使用加密串流時,能更精細地控制協定和驗證設定。

本遷移指南的 PHP 5.6.x 中的 OpenSSL 變更 章節更詳細地描述了這些變更。

pgsql 非同步支援

pgsql 擴充套件現在支援非同步連線和查詢,從而在與 PostgreSQL 資料庫互動時啟用非阻塞行為。可以使用常數 PGSQL_CONNECT_ASYNC 建立非同步連線,並使用新的函數 pg_connect_poll()pg_socket()pg_consume_input()pg_flush() 來處理非同步連線和查詢。

新增註記

使用者貢獻的註記

此頁面沒有使用者貢獻的註記。
To Top