它終於來了!一起來探查PHP8測試版都有些啥東東

2021-10-23 09:37:03 字數 3978 閱讀 9274

其實 php8 的這個第一版測試版 (php-8.0.0alpha1) 在2023年6月底就已經上線了,不過也是近兩天去官網的時候才看到。這個版本是第乙個公開的測試版,也就是說,它是不能用於生產環境的,畢竟改動很多還不會特別的穩定。而今天,我們主要就是來看看 php8 帶來的那些改變。

首先,我們先說說 jit 。說著都在等 jit ,但其實使用 jit 還是有很多限制的,比如說它是配合 opcache 使用的。如果你的應用並不需要開啟 opcache 的話,比如說流量很小的一些後台管理系統,這個 jit 對你來說也並沒有太大的作用。具體的 jit 原理也就不說了,因為自己也看不懂!!所以各位大佬可以直接移步鳥哥的部落格看看鳥哥對 jit 的說明:

接下來,主要說一些語法和函式擴充套件方面的變化,這些變化可能會導致你需要修改現有的專案**才能在 php8 執行,當然,也有很多功能可能會為你的**質量或者速度帶來質的飛躍。(以下內容摘抄官方文件說明)。當然,並不是所有的內容都照搬翻譯了一遍,有些不常用的內容就沒有寫在這裡了,具體的內容大家可以看官方原始碼文件。

關於效能提公升的內容在文章最後哦!!

// replace

function my_error_handler($err_no, $err_msg, $filename, $linenum) 

// ...

}// with

function my_error_handler($err_no, $err_msg, $filename, $linenum) 

// ...

}

// replace

function test(int $arg = const_resolving_to_null) {}

// with

function test(?int $arg = const_resolving_to_null) {}

// or

function test(int $arg = null) {}

許多通知轉換成了警告:

將字串偏移量分配給多個位元組產生警告

原始檔中的意外字元(如字串外的空位元組)將導致 parseerror 異常

未捕獲的異常要經過 "clear shutdown" ,意味著將在未捕獲異常之後進行析構

編譯時的致命錯誤 "only variables can be passed by reference" 延遲到執行時,並轉換為 "cannot pass parameter by reference" 的錯誤異常

一些 "only variables should be passed by reference" 相關的警告轉換為 "cannot pass parameter by reference" 錯誤異常

匿名類的生成名稱已更改。它現在將包括第乙個父級或介面的名稱

new class extends parentclass {};

// -> parentclass@anonymous

new class implements firstinte***ce, secondinte***ce {};

// -> firstinte***ce@anonymous

new class {};

// -> class@anonymous

function test($a = , $b) {}       // deprecated

function test(foo $a = null, $b) {} // allowed

class x 

function func() {}

}

trait mytrait 

class myclass 

}

'e' 格式寫法從 mb_ereg_replace() 中移除,使用 mb_ereg_replace_callback() 代替

帶查詢值 (needle) 的函式引數可以為空,mb_strpos(), mb_strrpos(), mb_stripos(), mb_strripos(), mb_strstr(), mb_stristr(), mb_strrchr(), mb_strrichr()

將編碼作為第三個引數而不是函式的偏移量傳遞的傳統行為已被刪除,請提供顯式的0偏移量,而將編碼作為第四個引數,如 mb_starpos()

pdo 預設的錯誤處理已經改為異常

reflection 反射類的一些函式引數改變為支援多引數

reflection 的 export() 方法被移除

reflection 的 __tostring() 方法將返回該型別的完整除錯表示形式,不再被棄用。這個功能可能在 php 版本之間會發生變化

reflection 的 isconstructor() 和 isdestructor() 也可以應用於介面了,之前只適用於類或 trait

splfileobject::fgetss() 被移除

splheap::compare($a, $b) 指定了乙個方法簽名,繼承實現的類必須使用相容的方法簽名

spldoublylinkedlist::push() 、spldoublylinkedlist::unshift() 、spldoublylinkedlist::enqueue() 現在返回 void 代替之前的 true

spl_autoload_register() 現在始終對無效引數丟擲 typeerror ,之前第二個引數將被忽略,如果設定為 false ,則會發出通知

asset() 不再計算字串引數,如 assert('$a==$b'),應該使用 assert($a == $b)

不指定陣列的話將無法使用 parse_str() ,fgetss() 被移除

string.strip_tags 過濾器語法被移除

帶查詢值 (needle) 的函式引數可以為空,strpos(), strrpos(), stripos(), strripos(), strstr(), strchr(), strrchr(), stristr(),並且始終被解釋為字串

帶長度引數的字串函式可以為空,substr(), substr_count(), substr_compare(), iconv_substr()

array_splice() 的長度偏移量引數可以為空

vsprintf()、vfprintf() 和 vprintf() 的args引數現在必須是陣列。以前接受任何型別

password_hash() 的 "salt" 選項不再支援,如果使用會產生警告

hebrevc() 、 convert_cyr_string() 、 money_format() 、 ezmlm_hash() 、 restore_include_path() 、 get_magic_quotes_gpc() 、 get_magic_quotes_gpc_runtime() 、 filter_sanitize_magic_quotes 被移除

不再支援使用相反順序的引數呼叫 implode()

parse_url() 現在將區分不存在和空的查詢和片段:

=> query = null, fragment = null

?  => query = "",   fragment = null

#  => query = null, fragment = ""

?# => query = "",   fragment = ""

這些就是 php8 帶給我們的驚喜了。可以看出,這次的大改版修改或移除了很多函式,也對不少的核心擴充套件進行了公升級。當然,大家最關心的還是 jit 的引進會對我們的效能產生怎樣的影響,不過除了 jit 之外,我認為註解能力的引入也是一大亮點。鳥哥在最近更新的關於 php8 的文章中,也首先就提到了這兩個能力。大家可以在下面的鏈結中檢視原鳥哥講解的原文。另外,在 cpu 應用指令碼的基準測試中,jit 能力的效率是 php5 的 41 倍以上,鳥哥在文章中也做過了這方面的測試。所以說,期待正式版吧,看看丟到伺服器上的 php8 能為我們帶來多少的效能提公升。

一起來學習Ant Design

當然,都屬於webpack中的基礎知識,但是套上了atool build這樣乙個殼子,又有點小懵。還好不是很難,嘗試後,很快搞定了,順手也總結一下吧!一 安裝ant init 1 npm install antd init g 二 建立目錄 1 mkdir antd demo cd antd dem...

一起來存方法

1.在動態渲染元素的時候,需要邏輯判斷 在迴圈渲染dom元素時,迴圈遍歷中需要邏輯操作,如果不使用模板 1 var addlist function 7 if 條件2 10lists.push list 11 12 id html lists.join 13 這是在看一同事 時,發現她用push和j...

一起來了解cookie呀!!!

1.什麼是cookie cookie是由伺服器傳送給客戶端,也就是瀏覽器的資訊 小量的 2.用來幹什麼 cookie是鍵值對形式儲存的少量資訊,幫助我們跟蹤會話,一般該資訊記錄使用者身份。cookie也常常用來記錄購物車的商品資訊,例如 數量 記錄使用者訪問次數等等。3.原理是什麼 當客服端請求伺服...