PHP 7 有些什麼值得期待?(二)

2021-07-09 12:14:42 字數 3058 閱讀 8400

新增的轉義字元,\u,允許我們在php字串中直接加入unicode編碼字元:

使用語法如下\u,例如綠色的心形 ��,可以直接用php字串表示:」\u」。

又乙個新的操作符,空值合併操作符,??。返回左運算元如果其不為null,否則返回右運算元。

而且很重要的一點是,當左運算元未定義時,不會產生提示錯誤。此特性更像是isset()函式,而不像?:三元操作符。

你可以鏈式使用此操作符,它將返回第乙個非空值。

$config = $config ?? $this->config ?? static::$defaultconfig;
php 5.4版本時,提供了closure->bindto()closure::bind()方法,用於改變閉包中$this的繫結物件和作用域,同時複製乙個新的閉包。

php 7現在加入了乙個更加簡單的方法closure->call(),使其在呼叫時繫結$this和作用域。此方法將繫結的物件作為第乙個引數,其後的引數作為閉包引數傳入,如下:

<?php

class

helloworld

$closure = function

($whom)

$obj = new helloworld();

$closure->call($obj, 'world'); // hello world

如果你曾有從同乙個命名空間引入很多類,你可能會更高興你的開發工具自動幫你完成了這些工作。對於其他沒有使用自動完成工具的人來講,php 7現在提供了成組使用use申明的方法。它使得你能更快地更清晰引入同乙個命名空間下的多個類。

<?php

// 以前

useframework\component\subcomponent\classa;

useframework\component\subcomponent\classb

asclassc;

useframework\component\othercomponent\classd;

<?php

// 成組申明

useframework\component\;

它也可以與常量和函式的匯入混用。

<?php

useframework\component\;

生成器加入了兩個新的特性。第乙個就是生成器使用return語句,它允許生成器執行完畢後,返回乙個值。

在php 7之前,如果你嘗試返回任何東西,都會報錯。然而,現在你可以呼叫$generatro->getreturn()來取得返回值了。

如果生成器還沒有返回,或者已經丟擲異常了,那麼執行$generator->getreturn()也會丟擲異常。

如果沒有return語句的生成器執行完畢,則返回null值。

下面有個示例:

<?php

function

gen()

$gen = gen();

foreach ($gen

as$value)

// 第一次輸出 "hello",接著是" ", "world!"

echo

$gen->getreturn(); // goodbye moon!

第二個特性更加令人激動:生成器**。此特性允許你返回另乙個可以迭代的結構,並使其被遍歷——例如陣列,迭代器或者另乙個生成器。

子結構的迭代是由最外層的迴圈來完成的,單層次的迴圈而非以遞迴的方式。

當傳遞資料或異常給生成器時,就像直接呼叫子結構一樣,也是直接傳遞給子結構的。

**語法yield from \

<?php

function

hello

() function

goodbye

() $gen = hello();

foreach ($gen

as$value)

每一次迭代的輸出如下:

「hello」

」 「「world!」

「goodbye」

」 「「moon!」

有一點需要小心:因為子結構自身也可能被迭代產生值,所以完全有可能同乙個值被多個迭代所返回——如果這不是你想要的,則需要你自己去避免。

在之前的php中處理並捕獲致命錯誤幾乎是不可能的。但隨著新增加的引擎異常,許多這些錯誤將能夠轉化為異常丟擲。

現在,當乙個致命錯誤發生時,將丟擲異常,這樣你就可以優雅地處理它了。如果你不去處理它,則會產生傳統的不可捕獲的致命錯誤。

這些異常是\engineexception的例項,且與使用者空間的異常不同,它並沒有整合基礎的\exception類。這樣做是為了確保現有**中捕獲\exception的地方不會變得能夠捕獲到這些致命錯誤並繼續執行下去。這樣就保證了**向後相容。

以後,如果你想一起捕獲傳統的異常和引擎異常,那麼你需要使用到新增的、它們所共有的父類\baseexception

另外,在eval()函式使用時的解析錯誤會丟擲乙個\parseexception,同時型別不匹配會丟擲乙個\typeexception異常。

這兒有個例子:

<?php

try catch (\engineexception $e)

object(engineexception)#1 (7)

翻譯自:what to expect when you』re expecting: php 7, part 2

PHP 7 值得期待的新特性(下)

這是我們期待已久的 php 7 系列文章的第二篇。點此閱讀 第一篇本文系 oneapm 工程師編譯整理。也許你已經知道,重頭戲 php 7 的發布將在今年到來!現在,讓我們來了解一下,新版本有哪些新功能與改進。在本系列的 第一篇 我們介紹了 php 7 中最重要的一些不相容性修復以及兩大新特性。在本...

吊炸天的 PHP 7 ,你值得擁有

2015年的夏天,雖然來得不算火熱,但是在網際網路技術的夏天,比任何一年都更為火熱。剛剛才結束了 5 月底的網易 支付寶 攜程以及多家雲儲存廠商的接連故障的壞訊息,6月上旬則迎來了程式語言界兩大好訊息,第一件是 swift 2.0 發布以及開源,另一件是 php 7 alpha 版正式發布。這兩件大...

PHP7為什麼比PHP5快?

效能提公升的原因?1 儲存變數的結構體變小,盡量使結構體裡成員共用記憶體空間,減少引用,這樣記憶體占用降低,變數的操作速度得到提公升。2 字串結構體的改變,字串資訊和資料本身原來是分成兩個獨立記憶體塊存放,php7盡量將它們存入同一塊記憶體,提公升了cpu快取命中率。3 陣列結構的改變,陣列元素和h...