?PHP 8.1 即將到來

PHP 8.1 目前正在積極開發(fā)中,將于2021年11 月 25 日發(fā)布。請記住,如果核心開發(fā)團(tuán)隊(duì)(例如)添加額外的 Beta 版本,此日期仍可能會(huì)更改。我們已經(jīng)了解新功能、性能改進(jìn)、更改和棄用;所以讓我們一一介紹。

1
Enums(枚舉)
枚舉將在 PHP 8.1 中添加!
添加枚舉將是 PHP 的重大改進(jìn),因此我非常期待看到枚舉在 PHP 8.1 中出現(xiàn)。為了讓您快速預(yù)覽它們的外觀,這里有一個(gè)代碼示例:
enum Status {
case Pending;
case Active;
case Archived;
}這就是它們的使用方式:
class Post
{
public function __construct(private Status $status = Status::Pending;)
{}
public function setStatus(Status $status): void
{
// …
}
}
$post->setStatus(Status::Active);2
Fibers(纖程)
Fibers——又名“綠色線程” ——是一種管理并行性的低級機(jī)制。您可能不會(huì)直接在您的應(yīng)用程序中使用它們,但是像 Amphp 和 ReactPHP 這樣的框架會(huì)大量使用它們。
這是使用纖維的簡單示例:
$fiber = new Fiber(function (): void {
$valueAfterResuming = Fiber::suspend('after suspending');
// …
});
$valueAfterSuspending = $fiber->start();
$fiber->resume('after resuming');3
性能改進(jìn)
Dmitry Stogov 對 opcache 進(jìn)行了一些改進(jìn),他稱之為“繼承緩存”。此功能允許緩存類之間的鏈接,就像從 PHP 7.4 開始可以預(yù)加載鏈接的類一樣。
由于這一變化,Dmitry 報(bào)告了 5% 到 8% 的性能提升,這是 PHP 8.1 中需要注意的一個(gè)很好的小細(xì)節(jié)。
4
使用字符串鍵重寫數(shù)組
PHP 7.4 中已經(jīng)允許數(shù)組解包,但它只適用于數(shù)字鍵。之前不支持字符串鍵的原因是因?yàn)閷τ谌绾魏喜?shù)組重復(fù)項(xiàng)沒有達(dá)成任何共識。RFC 通過遵循以下語義干凈地解決了這個(gè)問題array_merge:
$array1 = ["a" => 1];
$array2 = ["b" => 2];
$array = ["a" => 0, ...$array1, ...$array2];
var_dump($array); // ["a" => 1, "b" => 2]5
類構(gòu)造賦值
這個(gè) RFC 允許你new在函數(shù)定義中使用關(guān)鍵字作為默認(rèn)參數(shù),以及在屬性參數(shù)和其他地方。
class MyController {
public function __construct(
private Logger $logger = new NullLogger(),
) {}
}
請注意,此 RFC 仍在投票中,但很明顯它會(huì)通過。
6
只讀屬性
類屬性可以標(biāo)記為只讀,這意味著它們只能寫入一次。
class PostData {
public function __construct(
public readonly string $title,
public readonly DateTimeImmutable $date,
) {}
}
在初始化后嘗試更改只讀屬性將導(dǎo)致錯(cuò)誤:
$post = new Post('Title', /* … */);
$post->title = 'Other';
Error: Cannot modify readonly property Post::$title
請注意,此 RFC 仍在投票中,但很明顯它會(huì)通過。
7
可調(diào)用對象語法
您現(xiàn)在可以通過調(diào)用可調(diào)用對象并將其...作為參數(shù)傳遞來從可調(diào)用對象創(chuàng)建閉包:
function foo(int $a, int $b) { /* … */ }
$foo = foo(...);
$foo(a: 1, b: 2);
請注意,此 RFC 仍在投票中,但很明顯它會(huì)通過。
8
新的never類型
該never類型可用于指示函數(shù)將實(shí)際停止程序流。這可以通過拋出異常、調(diào)用exit或其他類似函數(shù)來完成。
function dd(mixed $input): never
{
// dump
exit;
}
never不同之處void在于void仍然允許程序繼續(xù)。這似乎是一個(gè)新奇的功能,但它實(shí)際上對靜態(tài)分析器來說是一個(gè)非常有用的功能。
9
新的array_is_list方法
您可能偶爾不得不處理這個(gè)問題:確定數(shù)組的鍵是否按數(shù)字順序排列,從索引 0 開始。就像json_encode決定數(shù)組應(yīng)該被編碼為數(shù)組還是對象一樣。
PHP 8.1 添加了一個(gè)內(nèi)置函數(shù)來確定數(shù)組是否是具有這些下標(biāo)的列表:
$list = ["a", "b", "c"];
array_is_list($list); // true
$notAList = [1 => "a", 2 => "b", 3 => "c"];
array_is_list($notAList); // false
$alsoNotAList = ["a" => "a", "b" => "b", "c" => "c"];
array_is_list($alsoNotAList); // false10
最終類常量
PHP 中的類常量可以在繼承過程中被覆蓋:
class Foo
{
public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
}
從 PHP 8.1 開始,您可以將這樣的常量標(biāo)記為final以防止出現(xiàn)這種情況:
class Foo
{
final public const X = "foo";
}
class Bar extends Foo
{
public const X = "bar";
Fatal error: Bar::X cannot override final constant Foo::X
}11
限制$GLOBALS使用
對如何$GLOBALS使用的微小更改將對所有數(shù)組操作的性能產(chǎn)生重大影響。Nikita 在RFC 中很好地解釋了問題和解決方案。更改意味著某些邊緣情況無法再使用$GLOBALS. “不再支持寫入作為一個(gè)整體的 $GLOBALS。以下所有內(nèi)容都會(huì)產(chǎn)生編譯時(shí)錯(cuò)誤”:
$GLOBALS = [];
$GLOBALS += [];
$GLOBALS =& $x;
$x =& $GLOBALS;
unset($GLOBALS);
最重要的是,通過$GLOBALS引用傳遞會(huì)產(chǎn)生一個(gè)運(yùn)行時(shí)錯(cuò)誤:
by_ref($GLOBALS); // Run-time error
Nikita 分析了 Packagist 上排名前 2000 的軟件包,僅發(fā)現(xiàn)了 23 個(gè)會(huì)受此更改影響的案例。我們可以得出這樣的結(jié)論——從技術(shù)上講,這種變化的影響很小,這就是內(nèi)部人員決定在 PHP 8.1 中添加它的原因。
12
其他小改動(dòng)
每次發(fā)布時(shí),都會(huì)對語言進(jìn)行一些非常小的更改。所有這些都列在GitHub 上的升級指南和小的棄用 RFC 中,如果您想了解每個(gè)小細(xì)節(jié),請務(wù)必查看。
以下是最重要變化的摘要:
MYSQLI_STMT_ATTR_UPDATE_MAX_LENGTH不再有效果MYSQLI_STORE_RESULT_COPY_DATA不再有效果PDO::ATTR_STRINGIFY_FETCHES
現(xiàn)在也適用于布爾值
當(dāng)使用模擬的準(zhǔn)備語句時(shí),PDO MySQL 和 Sqlite 結(jié)果集中的整數(shù)和浮點(diǎn)數(shù)將使用原生 PHP 類型而不是字符串返回
像
htmlspecialchars和htmlentities現(xiàn)在這樣的函數(shù)也'默認(rèn)轉(zhuǎn)義為'; 格式錯(cuò)誤的 UTF-8 也將被替換為 unicode 字符,而不是導(dǎo)致空字符串的
hash,hash_file并hash_init增加了一個(gè)額外的參數(shù)給他們所謂的$options,它有一個(gè)默認(rèn)值[],這樣就不會(huì)影響到你的代碼對
MurmurHash3和的新支持xxHash

PHP 8.1 的更新還有很多,公眾號篇幅有限我也不一一講解了,主要是排版太痛苦了[Doge],不過現(xiàn)在 PHP 也開始往強(qiáng)類型和協(xié)程方向迭代,還是挺值得期待的。

如果覺得文章不錯(cuò)歡迎點(diǎn)贊和轉(zhuǎn)發(fā),關(guān)注本公眾號不定期推送PHP技術(shù)文章。

