欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP5.2.x至PHP8.0.x版本升級新增特性

 更新時間:2024年02月24日 17:31:37   投稿:yin  
新版本PHP引入了許多新的語法和語言功能,以及更嚴(yán)格的類型檢查,需要進行一些代碼修改和調(diào)整,對于使用PHP5開發(fā)的項目,升級到PHP8可能需要花費一些時間和精力,此外,由于PHP對一些舊有函數(shù)和方法進行了廢棄和刪除,可能還需要進行一些代碼重構(gòu)

PHP 8之所以具有出色的性能,是因為它引入了JIT編譯器、優(yōu)化了函數(shù)調(diào)用和數(shù)組操作、引入了新的數(shù)據(jù)結(jié)構(gòu)和算法,并修復(fù)和優(yōu)化了一些內(nèi)部實現(xiàn)細節(jié)。這些改進使得PHP 8在執(zhí)行速度和內(nèi)存管理方面都有了顯著的提升,使得開發(fā)人員能夠更高效地開發(fā)和部署Web應(yīng)用程序。

PHP5到PHP8之間的升級并不容易。由于新版本PHP引入了許多新的語法和語言功能,以及更嚴(yán)格的類型檢查,需要進行一些代碼修改和調(diào)整。對于使用PHP5開發(fā)的項目,升級到PHP8可能需要花費一些時間和精力。此外,由于PHP對一些舊有函數(shù)和方法進行了廢棄和刪除,可能還需要進行一些代碼重構(gòu)。因此,在進行升級之前,開發(fā)人員需要仔細評估自己的項目,并制定相應(yīng)的升級計劃。

版本特性

php5.2以前(2006前)

autoload的使用;當(dāng)在代碼中使用一個未定義的類的時候,該函數(shù)就會被調(diào)用
現(xiàn)在已經(jīng)不再使用了,因為一個項目中只能有一個__autoload();現(xiàn)在使用spl_autoload_register();
PDO和MiSQLi的使用
類型約束。
通過類型約束可以限制參數(shù)的類型,不過這個機制不完善。

php5.2(2006-2011)

(2006-2011)
JSON的支持
       增加了json_encode(),json_decode()等函數(shù)

php5.3(2009-2012)

PHP5.3 算是一個非常大的更新,新增了大量新特征,同時也做了一些不向下兼容的修改

1.棄用的功能

以下幾個功能被棄用,若在配置文件中啟用,則 PHP 會在運行時發(fā)出警告。
Register Globals
Magic Quotes
Safe Mode

2.匿名函數(shù)

3.新增了魔術(shù)方法 __invoke(),__callStatic()

4.命名空間,但不完善,只支持類

5.后期靜態(tài)綁定

6.Heredoc 和 Nowdoc

對 Heredoc 以及 Nowdoc 進行了一些改進,它們都用于在 PHP 代碼中嵌入大段字符串。

7.用 const 定義常量

PHP5.3 起同時支持在全局命名空間和類中使用 const 定義常量。

8.三元運算符簡寫形式

9.Phar

PHP5.4(2012-2013)

1.Short Open Tag

在 PHP5.3 起被默認開啟,在 PHP5.4 起總是可用。
使用這種簡寫形式在 HTML 中嵌入 PHP 變量將會非常方便。
對于純 PHP 文件(如類實現(xiàn)文件), PHP 官方建議頂格寫起始標(biāo)記,同時 省略 結(jié)束標(biāo)記。
這樣可以確保整個 PHP 文件都是 PHP 代碼,沒有任何輸出,否則當(dāng)你包含該文件后,設(shè)置 Header 和 Cookie 時會遇到一些麻煩!
注:Header 和 Cookie 必須在輸出任何內(nèi)容之前被發(fā)送。

2.數(shù)組簡寫形式

3.Traits

所謂Traits就是“構(gòu)件”,是用來替代繼承的一種機制。PHP中無法進行多重繼承,但一個類可以包含多個Traits.

4.內(nèi)置 Web 服務(wù)器

PHP從5.4開始內(nèi)置一個輕量級的Web服務(wù)器,不支持并發(fā),定位是用于開發(fā)和調(diào)試環(huán)境。

5.細節(jié)修改

PHP5.4 新增了動態(tài)訪問靜態(tài)方法的方式:

PHP5.5(2013起)

1.yield 生成器可以用于大文件處理

2.list() 用于 foreach

3.細節(jié)修改

不推薦使用 mysql 函數(shù),推薦使用 PDO 或 MySQLi。
不再支持Windows XP.
可用 MyClass::class 取到一個類的完整限定名(包括命名空間)。
empty() 支持表達式作為參數(shù)。
try-catch 結(jié)構(gòu)新增 finally 塊。

PHP 5.5.x->PHP 5.6.x

新增

使用表達式定義常量。
使用...運算符定義變長參數(shù)函數(shù)。
使用右連接運算符**來進行冪運算。
支持大于2GB的文件上傳。
使用hash_equals()函數(shù),以恒定的時間消耗來進行字符串比較,以避免根據(jù)精確測量執(zhí)行時間反推出密碼的時序攻擊。
__debugInfo(),當(dāng)使用var_dump()輸出對象時,可以用來控制要輸出的屬性和值。
對SSL/TLS的支持進行大幅度提升,包括默認啟用端點驗證選項來支持證書指紋比對,以避免TLS重新協(xié)商攻擊。
pgsql拓展支持以異步方式連接數(shù)據(jù)庫和執(zhí)行查詢,即可以使用非阻塞的方式與PostgreSQL數(shù)據(jù)庫進行交互。

修改

只有設(shè)置CURLOPT_SAFE_UPLOAD為false的情況下,才能使用@file語法上傳文件,因此最好采用CURLFile代替。
使用數(shù)組標(biāo)識符為類定義數(shù)組類型的屬性時,數(shù)組的鍵不會被覆蓋。可以理解為數(shù)組里顯式鍵和隱式序列鍵相同時,數(shù)組的鍵不會相互覆蓋。
對于JSON字面量true,false和null,必須采用字母全部小寫的形式。
一些Mcrypt函數(shù)需要設(shè)置有效長度的密鑰和初始向量,不再接受無效長度的密鑰和初始向量。

廢除

廢止從不兼容的上下文調(diào)用方法。
廢棄了iconv和mbstring配置選項中和編碼相關(guān)的選項,建議使用default_charset。

PHP 5.6.x->PHP 7.0.x

新增

對于標(biāo)量類型聲明,不論是強制(默認)模式還是嚴(yán)格模式,都可以使用浮點數(shù)、字符串、布爾值、整數(shù) 類型的參數(shù)類型。
對返回類型聲明的支持,返回類型聲明( : )指明了函數(shù)返回值的類型。
null合并運算符(??),作用相當(dāng)于簡化三元表達式。如果變量存在并且值不為null,則返回自身值,否則就返回它的第二個操作數(shù)。
組合比較符<=>,用于比較兩個表達式。第一個表達式的值大于、等于、小于第二個表達式的值時,對應(yīng)的返回值依次是1、0、-1。
通過define()可定義數(shù)組類型的常量。
支持通過new class來實例化一個匿名類,可用來替代一些“用后即消除”的完整類定義。
Closure::call()可以簡潔地暫時綁定一個方法到對象上閉包并調(diào)用它。
為unserialize()提供過濾,可通過白名單的方式來防止惡意代碼的注入,以更安全的方式解包不可靠的數(shù)據(jù)。
IntlChar類旨在公開出更多的ICU(開源項目)功能,這個類自身定義了很多靜態(tài)方法用來操作Unicode字符集。若使用此類,需要先安裝Intl拓展。
從同一個namespace引入的類、常量和函數(shù)現(xiàn)在可以用單個use語句一次性導(dǎo)入。
生成器可以返回表達式,可通過調(diào)用Generator::getReturn()來獲取生成器返回值。
在最外層生成中使用yield from 就可以把一個生成器自動委派給其它的生成器,Traversable(遍歷)對象或者array。
intdiv()函數(shù)用于整數(shù)的除法運算。
session_start()可以接受一個數(shù)組作為參數(shù),覆蓋php.ini里的會話配置選項。
通過preg_replace_callback_array()函數(shù),可以使用一個關(guān)聯(lián)數(shù)組對每個正則表達式注冊回調(diào)函數(shù)。
random_bytes()和random_int()用來產(chǎn)生高安全級別的隨機字符串和隨機整數(shù)。

修改

dirname()增加了可選的第二個參數(shù) depth,用于獲取當(dāng)前目錄向上depth級的父目錄名稱。
xml_parser_free()不再足以釋放解析器資源,如果它引用了一個對象,而這個對象引用了一個解析器資源,在這種情況下,需要額外地設(shè)置取消解析器。
在PHP7中,很多運行錯誤都轉(zhuǎn)為異常來處理了,這些異常繼承自Error類,此類實現(xiàn)了Throwable接口(所有異常都實現(xiàn)了這個基礎(chǔ)接口)。這也就意味著,當(dāng)程序運行發(fā)生錯誤時,以前的代碼里如果沒有捕獲Error類異常,那么一些關(guān)于錯誤處理的代碼將觸發(fā)不了,這會導(dǎo)致程序運行很嚴(yán)重的錯誤。
對變量、屬性和方法的調(diào)用將嚴(yán)格遵守從左到右的解析順序,如果需要兼容舊的程序,需要使用大括號。
list()不支持空的賦值,且在賦值時按照變量被定義的順序來賦值,而非反過來的順序。
list()不能解開字符串變量,可以用str_split函數(shù)來代替。
foreach不改變內(nèi)部數(shù)組指針。
foreach通過引用遍歷時,有更好的迭代特性。例如在迭代中添加一個迭代值到數(shù)組中。
一個八進制字符里如果含有無效數(shù)字(如8),這樣的八進制字符將產(chǎn)生解析錯誤,而不是靜默刪節(jié)。
以負數(shù)形式進行的位移運算符將拋出異常,而不是返回0。
除以0將返回一個由IEEE754指定的浮點數(shù):+INF、-INF或者NAN,而不是拋出一個警告錯誤并返回false。
十六進制字符串不被視為數(shù)字,可以用filter_var()函數(shù)檢查一個字符串是否包含十六進制數(shù)字,并將其中的十六進制數(shù)字字符串轉(zhuǎn)換為整數(shù)。
yield變更為右聯(lián)接運算符。
在函數(shù)定義中,不可以包含兩個或多個同名參數(shù)。
當(dāng)在函數(shù)代碼中使用func_get_arg()或者func_get_args()方法查看函數(shù)參數(shù)值,或者用debug_backtrace()方法查看回溯跟蹤,以及在異?;厮葜兴吹降暮瘮?shù)參數(shù)值是當(dāng)前值,而非傳入函數(shù)時的原始值。
在ini文件里,不支持#表示注釋,需要用;來表示注釋。
JSON拓展已被JSOND拓展取代,對于數(shù)值處理要注意數(shù)值不能以點號.結(jié)束,科學(xué)計數(shù)法e前面一位字符不可以是點號.,如3.e3應(yīng)該改寫為3.0e3或者3e3。另外,空字符串不被當(dāng)作有效的JSON字符串。
在數(shù)值溢出時,內(nèi)部函數(shù)會失敗。例如將數(shù)值很大的浮點數(shù)轉(zhuǎn)換為整數(shù),無法以整數(shù)表達時,將會報錯并返回null,而不是自動將整數(shù)截斷不報錯誤。
由于內(nèi)部排序算法進行了提升,會導(dǎo)致對比時視為相等元素的排序順序不穩(wěn)定。
declare(ticks)指示符不再泄漏到不同的編譯單元里。
listen端口同時監(jiān)聽IPV4地址和IPV6地址。

廢除

preg_replace()不再支持\e(可以把匹配來的字符串當(dāng)作正則表達式來用),需要用preg_replace_callback函數(shù)來替代
所有的ereg系列函數(shù)被移除,PCRE作為其替代品。
一些廢棄的mcrypt_開頭的函數(shù)被移除。
所有ext/mysql函數(shù)被移除。
移除了類似ASP的標(biāo)簽和Script PHP標(biāo)簽。例如<% %>、<%= %>、<script language=”php”>。
PHP4風(fēng)格的構(gòu)造函數(shù)(方法名和類名一樣)將被棄用。
廢棄了靜態(tài)調(diào)用未聲明成static的方法。
廢棄了password_hash()函數(shù)里的鹽值選項,阻止開發(fā)者生成自己的鹽值(通常更不安全),該函數(shù)將自行生成密碼學(xué)安全的鹽值。
廢棄了capture_session_meta內(nèi)的SSL上下文選項,可以通過stream_get_meta_data()來獲取SSL元數(shù)據(jù)(metadata)。

PHP 7.0.x->PHP 7.1.x

新增

可為空(Nullable)類型。參數(shù)及返回值的類型可以在其類型前加上一個?表示可空,當(dāng)啟用這個特性時,傳入的參數(shù)或者函數(shù)返回的結(jié)果要么是指定類型,要么是null。
新的返回值類型void。返回值生命為void類型的函數(shù)需要省去返回值(去掉return或者return;), 注意這里返回null也不允許,但是如果企圖獲取一個返回值類型為void的函數(shù)返回值時,會得到一個null,并且不會因此產(chǎn)生警告。
短數(shù)組語法([])作為list()語法的一個備選項,可用于將數(shù)組的值賦給一些變量(包括在foreach中)。list()和[]已支持在其內(nèi)部指定鍵名,這意味著可以將任意類型的數(shù)組賦值給一些變量。
支持設(shè)置類常量的可見性。
引入了iterable偽類(與callable類似)。它可以被用在參數(shù)或者返回值類型中,代表接受一個數(shù)組或者實現(xiàn)了遍歷接口的對象。至于子類,當(dāng)iterable偽類用作父類的參數(shù)類型時,子類可以收緊父類的iterable參數(shù)類型為數(shù)組類型或者實現(xiàn)了遍歷接口的對象類型。另外,子類可以將返回值由父類返回值的數(shù)組類型或者實現(xiàn)了遍歷接口的對象類型,拓展為iterable偽類類型。
多異常捕獲處理。一個catch語句塊可以通過管道字符|來實現(xiàn)多個異常的捕獲,這在需要同時處理來自不同類的不同異常時很有用。
ext/openssl 支持了AEAD(模式GCM和CCM)。方式是給openssl_encrypt()和openssl_decrypt() 添加額外的參數(shù)。
Closure::fromCallable()靜態(tài)方法可把callables轉(zhuǎn)為閉包。
異步信號處理。pcntl_async_signals()被引入,用于啟用無需ticks(開銷大)的異步信號處理。
對服務(wù)器推送的支持已經(jīng)加入到了CURL拓展中,這個可以通過curl_multi_setopt()函數(shù)與新的常量CURLMOPT_PUSHFUNCTION來調(diào)節(jié)。添加進來的CURL_PUSH_OK和CURL_PUSH_DENY兩常量可用來批準(zhǔn)或拒絕服務(wù)器推送回調(diào)的執(zhí)行。
支持為負的字符串偏移量。
//代碼示例
var_dump("abcdef"[-2]);    //string(1)  “e”
var_dump(strpos("aabbcc", "b", -3)); //int(3)
var_dump("abcdef"[-60]);    //string(0)  “”
var_dump(strpos("aabbcc", "b", -5)); //int(2)

修改

當(dāng)參數(shù)傳遞不足時將拋出錯誤,這僅對用戶定義的函數(shù)生效,內(nèi)置函數(shù)不生效。
在不完整的對象上不調(diào)用析構(gòu)方法(類的對象被銷毀時自動被調(diào)用的方法__destruct)。
parse_url()提供了更加嚴(yán)格的限制,例如對RFC3986的支持。
file_get_contents()接受負數(shù)作為搜索偏移量,前提是流上下文必須是可搜索的。
tempnam()會在退回使用系統(tǒng)臨時目錄的時候,產(chǎn)生警告。
json_encode()增加了新的選項:JSON_UNESCAPED_LINE_TERMINATORS,這個選項可以在指定值為JSON_UNESCAPED_UNICODE的時候?qū)τ赨+2028和U+2029這兩個字符不進行轉(zhuǎn)義。
PDO::LastInsertId()在用于PostgreSQL數(shù)據(jù)庫時,如果當(dāng)前會話(連接到PostgreSQL的數(shù)據(jù)庫連接)尚未調(diào)用過nextval,那么此方法會觸發(fā)一個錯誤。
Session ID不在生成時進行哈希。

廢除

mcrypt拓展被廢棄,并被OpenSSL所取代。

PHP 7.1.x->PHP 7.2.x

新增

新的對象類型,object,引進了可用于逆變(contravariant)參數(shù)輸入和協(xié)變(convariant)返回任何對象類型。
拓展文件不需要通過文件加載進行指定,可以在php.ini配置文件里進行啟用,也可以使用dl()函數(shù)(運行時載入一個php拓展)進行啟用。
允許重寫抽象方法。當(dāng)一個抽象類繼承另一個抽象類時,繼承后的抽象類可以重寫被繼承的抽象類里的抽象方法。
PDO的字符串類型已經(jīng)拓展為支持國際化的字符集。
為ext/PDO新增額外的模擬調(diào)試信息。PDOStatement::debugDumpParams()方法已更新,當(dāng)發(fā)送sql到數(shù)據(jù)庫時,在一致性、行查詢(包括替換綁定占位符)將會顯示調(diào)試信息。這一特性已經(jīng)加入到模擬調(diào)試中(模擬調(diào)試打開時可用)。
ext/LDAP(輕量目錄訪問協(xié)議)拓展新增了EXOP(extended operation,拓展操作)支持。
ext/sockets拓展 具備了查找地址信息的能力,且可以連接到地址,進行綁定和解析。
拓展了參數(shù)類型。重寫方法和接口實現(xiàn)的類型現(xiàn)在可以省略了,不過這仍然符合LSP(里氏替換原則),因為現(xiàn)在這種參數(shù)類型是逆變的。
命名空間可以使用尾隨逗號進行分組引入。

修改

阻止了number_format()返回負零。
將數(shù)組轉(zhuǎn)換為對象,或者將對象轉(zhuǎn)換為數(shù)組時,數(shù)字鍵得到了更好的處理。
get_class()函數(shù)不接受null參數(shù)。
計算非可數(shù)(non-countable)類型時,發(fā)出警告。
ext/hash從資源變成對象。要注意舊版本里相應(yīng)的is_resource()檢查改成is_object()檢查。
SSL/TSL的默認選項的改進。
gettype()對閉包資源的返回值會是“resource (closed)”,而非字符串“unknown type”。
object變更為強制保留字,禁止在任何接口和類的名稱里使用它。
使用默認參數(shù)的array_unique()會將不重復(fù)的原數(shù)組元素添加到一個新數(shù)組里,這可能改變原數(shù)組元素的鍵值。
parse_str()第二個參數(shù)已改為必填項,因為安全隱患問題(不加第二個參數(shù)會導(dǎo)致查詢字符串參數(shù)導(dǎo)入當(dāng)前符號表)。更改后查詢字符串轉(zhuǎn)為了Array。
utf8_encode()和utf8_decode()已作為字符串處理函數(shù)移到標(biāo)準(zhǔn)拓展中,不再需要去啟用XML拓展后才能使用。
imagegd()以真彩色存儲真彩色圖像,而不是轉(zhuǎn)化為調(diào)色板圖像。
傳遞給session_module_name()函數(shù)的模塊名不允許為“user”,會拋出一個異常錯誤。

廢除

sql.safe_mode ini設(shè)置項已被移除。
GD拓展庫里的png2wbmp()和jpeg2wbmp()已被廢棄。
__autoload()方法已廢棄,因為和spl_autoload_register()方法相比功能較差(因為無法鏈?zhǔn)教幚矶鄠€__autoloader),而且也無法在兩種autoloading樣式中配合使用。
track_errors ini設(shè)置和$php_errormsg變量已廢棄,因為提供了更好的方式:error_get_last()。
create_function()函數(shù)(有安全隱患問題,它是eval()的瘦封裝器)已被廢棄,更好的選擇是匿名函數(shù)。
mbstring.func_overload ini設(shè)置已廢棄,因為這個設(shè)置會影響環(huán)境中的字符串系列函數(shù),帶來相互操作中的問題。
(unset)類型強制轉(zhuǎn)化已廢棄,結(jié)果總是null。
gmp_random()函數(shù)已廢棄,可使用更好方式產(chǎn)生隨機數(shù):GMP拓展中的gmp_random_bits()和gmp_random_range()。
each()函數(shù)被廢棄,使用此函數(shù)遍歷時,比普通的foreach()更慢,而且給新語法的變化帶來實現(xiàn)問題。
assert()字符串參數(shù)要求它能被eval()執(zhí)行,考慮到可能被執(zhí)行遠程代碼,所以廢棄了assert()參數(shù)的字符串類型聲明,最好提供bool數(shù)據(jù)類型的參數(shù)。
錯誤處理器里的$errcontent參數(shù)被廢棄。代替做法:調(diào)試器應(yīng)該自己取回錯誤站點里的本地變量。
MCrypt拓展從內(nèi)核移到了PECL,由于mcrypt庫自2007年來未見任何更新,所以不建議使用mcrypt庫。代替品可以用OpenSSL,也可以用Sodium。

PHP 7.2.x->PHP 7.3.x

新增

更靈活的HereDoc和NowDoc語法,支持閉合標(biāo)記符的縮進,且不強制閉合標(biāo)記符的換行。但要注意閉合標(biāo)記符不要與正文中的字符串同名,避免出現(xiàn)語法錯誤和解析錯誤。
數(shù)組解構(gòu)(結(jié)構(gòu)化賦值)現(xiàn)在支持使用語法進行引用賦值。這對list()也同樣支持。
instanceof接受文字作為第一個操作數(shù),但這種情況下結(jié)果總是返回false。
允許在函數(shù)和方法調(diào)用后面使用逗號。
FastCGI進程管理器添加了log_limit、log_buffering等新選項以自定義FPM日志記錄。
對LDAP控件的完全支持已添加到LDAP查詢功能和ldap_parse_result()。
多字節(jié)字符串函數(shù)已可以正確處理大于2GB的字符串。
多字節(jié)字符串拓展的性能已得到全面顯著提高,尤其是大小寫轉(zhuǎn)換功能。
Arrayaccess(使對象像數(shù)組一樣被訪問)整數(shù)字符串鍵值得到嚴(yán)格解釋,整數(shù)字符串文字將不導(dǎo)致隱式轉(zhuǎn)換為整數(shù),例如$obj[“123”]將調(diào)用$obj->offsetGet(“123”);而非$obj->offsetGet(123);

修改

getimagesize()和相關(guān)函數(shù)已將BMP圖像的mime類型報告為image/bmp,而不是image/x-ms-bmp,因為前者已在IANA(互聯(lián)網(wǎng)數(shù)字分配機構(gòu))注冊。
默認情況下禁用rsh/ssh登錄,如果要啟用它們,需要使用imap.enable_insecure_rsh。注意IMAP庫在將郵箱名稱傳給rsh/ssh命令之前不會對其進行過濾,因此在啟用rsh/ssh的情況下將不受信任的數(shù)據(jù)傳遞給此函數(shù)是不安全的。
出于安全方面原因,傳入cookie的名稱不進行url解碼。
FTP默認傳輸模式已更改為二進制傳輸模式,而不是ASCII傳輸方式。
setcookie和setrowcookie函數(shù)接受$option數(shù)組參數(shù)。
getallheaders(獲取全部HTTP請求頭信息)函數(shù)已可用。
垃圾回收機制有所改進,帶來很大的性能提升。
涉及SimpleXML對象的數(shù)學(xué)運算已將文本當(dāng)作int或float,以更合適的方式處理,而非無條件地當(dāng)作整數(shù)處理。

廢除

大小寫不敏感的常量聲明已廢棄。
廢棄在命名空間里使用assert命名函數(shù),因為assert()函數(shù)屬于引擎特殊處理的情況。
image2wbmp()函數(shù)已廢棄。
已廢棄:將一個非字符串內(nèi)容傳遞給字符串搜索函數(shù)。替代為所有待搜索的內(nèi)容都會被當(dāng)作是字符串,而不是ASCII編碼值。如果需要依賴這個已被廢棄的特性,需要將傳入的非字符串內(nèi)容先顯式轉(zhuǎn)換為字符串類型,或者顯式地調(diào)用chr()。

PHP 7.3.x->PHP 7.4.x

新增

類的屬性支持添加指定的類型聲明。
支持完整的協(xié)變和逆變。協(xié)變使子類能比父類的返回類型更具體,逆變使子類能比父類接受的參數(shù)類型更寬泛。
合并空運算符賦值,??=后面可以接函數(shù)名。
數(shù)組展開操作中??梢杂?..接數(shù)組名作為另一個數(shù)組的數(shù)組項。
數(shù)字文字可以在數(shù)字之間包含下劃線。
弱引用允許保留對對象的引用,但不會阻止對象被銷毀。弱引用是通過變量來創(chuàng)建的,指向的是原始對象的符號表,可以讓垃圾回收器正常的回收,可以避免循環(huán)引用帶來的內(nèi)存泄露問題,能讓引用表現(xiàn)為類似C語言里的指針操作。
允許__tostring()方法拋出異常,而非阻止程序繼續(xù)運行的錯誤。
如果拓展是針對libcurl>=7.56.0創(chuàng)建的,那么CURLFile不僅支持文件名的處理,也支持流封裝器的處理。
FFI拓展。該拓展提供了一種調(diào)用本地函數(shù),訪問本地變量,及創(chuàng)建和訪問C庫中定義的數(shù)據(jù)結(jié)構(gòu)的簡單方法。
添加了IMG_FILTER_SCATTER圖像過濾器以將散列過濾器應(yīng)用于圖像。
mb_str_split()函數(shù)。str_split()用于將字符串分隔到數(shù)組中,但它僅可以分割字母和數(shù)字,新增的mb_str_split()函數(shù)是對其的補充,可以用來分割任何指定編碼的字符串。
緩存預(yù)加載特性。注意性能和內(nèi)存之間的最佳權(quán)衡可能因應(yīng)用程序而異,“預(yù)裝一切”可能是最簡單的策略,但不一定是最佳策略。
可以在sql查詢中轉(zhuǎn)義問號以避免其被當(dāng)作參數(shù)占位符,寫作??允許向數(shù)據(jù)庫發(fā)送一個問號,例如PostgreSQL JSON鍵緩存里存在問號時。
PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)允許檢查語句是否為只讀,即它是否不修改數(shù)據(jù)庫。
strip_tags第二個參數(shù)(允許通過的標(biāo)簽名單)已可以傳入一個數(shù)組。
添加了自定義對象序列化的新機制,它使用了兩個新的魔術(shù)方法:__serialize()和__unserialize()。新的序列化機制取代了Serializable接口。
為array_key_exists添加了一個專門的VM opcache優(yōu)化,如果該函數(shù)可以被靜態(tài)解析,則可以提高該函數(shù)的性能。如果在項目中使用命名空間,可能需要使用\array_key_exists()來顯式導(dǎo)入該函數(shù)。
箭頭函數(shù)提供了更簡潔的定義函數(shù)的方法。

修改

get_declared_classes()函數(shù)在匿名類未實例化時,不返回匿名類的名稱。
fn成了保留關(guān)鍵字,不可以作為函數(shù)名和類名,但是仍然可以作為方法名和類的常量名。
fread()和fwrite()在操作失敗時將返回false,而非空字符串或0。
token_get_all()為意外字符發(fā)出T_BAD_CHARACTER警告,而不是在令牌流中留下漏洞。
不推薦使用$this來解綁非靜態(tài)閉包里的$this。
imagescale()已支持將-1作為$new_width傳遞來使圖像縮放到指定高度時保持縱橫比。
哈希拓展已不能被禁用,它已成為PHP里很重要的組成成分,就像是日期拓展一樣。

廢除

MySQLi嵌入式服務(wù)器功能已被刪除。未記錄的mysqli::$stat屬性已被刪除,以支持mysqli::stat()。
導(dǎo)入類型庫的大小寫不敏感的常量注冊已被廢棄。
捆綁的libzip庫已被刪除。需要一個系統(tǒng)libzip>=0.11來構(gòu)建zip拓展。

PHP 7.4.x->PHP 8.0.x

新增

命名參數(shù)。命名參數(shù)允許根據(jù)參數(shù)名而不是參數(shù)位置向函數(shù)傳參,這使得參數(shù)的含義自成體系。命名參數(shù)通過在參數(shù)名前加冒號來傳遞,允許使用保留關(guān)鍵字作為參數(shù)名,參數(shù)與順序無關(guān),并允許任意跳過默認值。參數(shù)名必須是一個標(biāo)識符,不允許動態(tài)指定。
注解功能。注解的功能使得代碼中的聲明部分都可以添加結(jié)構(gòu)化、機器可讀的元數(shù)據(jù)。注解的目標(biāo)可以是類、類常量、屬性、方法、函數(shù)、參數(shù)。通過反射API可在運行時獲取注解中所定義的元數(shù)據(jù)。因此注解可以成為直接嵌入代碼的配置式語言。注解使用的一個簡單例子是:將接口(interface)里的可選方法改用注解實現(xiàn)。
構(gòu)造器屬性提升。構(gòu)造器里的參數(shù)可以相應(yīng)提升為類的屬性,注意對象屬性的類型不可以為callable,避免為引擎帶來混淆,因此提升的參數(shù)也不能是callable。
聯(lián)合類型。聯(lián)合類型接受多個不同的類型作為參數(shù),聲明聯(lián)合類型的語法是T1|T2|...。?T語法將當(dāng)作是聯(lián)合類型T|null的簡寫。注意null類型允許在聯(lián)合類型里使用,但是不能作為一個獨立的類型使用。
match表達式。match表達式與switch表達式相似,但是match表達式里是嚴(yán)格比較(===),一個match分支只能有一個表達式,每個分支都會有一個返回值,match的匹配表達式里可以用逗號來分割多個表達式。對于match表達式,傳入的參數(shù)必須存在與表達式匹配的條件或default要處理的條件,否則會報異常。match末尾的大括號后面要用分號;結(jié)束。
Nullsafe操作符(?->)。類屬性和方法可以通過nullsafe操作符訪問。對象引用解析為null時不拋出異常,而是返回null,如果是鏈?zhǔn)秸{(diào)用中的一部分,則剩余鏈條會直接跳過。此操作的結(jié)果類似于在每次訪問前用is_null()函數(shù)判斷一下屬性和方法是否存在,但代碼更加簡潔。注意僅當(dāng)null是屬性或者方法可能返回的預(yù)期值的情況下,才推薦用Nullsafe操作符。如果業(yè)務(wù)中需要明確指出錯誤,那么還是用拋出異常的方案來處理更好。
WeakMap類。WeakMap類接受對象作為鍵的映射(或字典),WeakMap鍵中的對象不影響對象的引用計數(shù)。它的主要用途是構(gòu)建源自對象的數(shù)據(jù)緩存,這些數(shù)據(jù)不需要比對象存在更長的時間。WeakMap類實現(xiàn)了ArrayAccess(數(shù)組式訪問)、Iterator(迭代器)和Countable(可計數(shù)),所以在大多數(shù)情況下,它可以以與關(guān)聯(lián)數(shù)組相同的方式使用。
static(如“后期靜態(tài)綁定”)可以用作返回類型。
可以通過$object::class來獲取類名,與get_class($object)返回結(jié)果一致。
HashContext對象已可以序列化。
new,instanceof(判斷一個對象是否是某個類的實例,或者實現(xiàn)了某個接口)可用于任何表達式。用法為 new (expression) (...$args)和$obj instanceof (expression)。
支持mixed(值可為任何類型)類型。
對加密消息語法(CMS)的支持。由用于加密、解密、簽名、驗證和讀取的函數(shù)組成。
可選的壓縮、加密功能已列入phpinfo中。
opcache拓展新增了即時編譯(JIT)的支持。
PhpToken向標(biāo)記器添加了一個基于對象的接口,它提供了更統(tǒng)一和符合功效學(xué)的表示,具備更高的內(nèi)存效率和更快的速度。

修改

數(shù)字與非數(shù)字類型的字符串非嚴(yán)格比較(==)時,將把數(shù)字轉(zhuǎn)換為字符串,然后比較兩個字符串。數(shù)字與數(shù)字類型的字符串非嚴(yán)格比較(==)時,則可理解為是把數(shù)字類型的字符串轉(zhuǎn)為數(shù)字,然后比較兩個數(shù)字。例如0==”” 將返回false,而不是true。
斷言(Assertion)失敗已默認拋出異常,如果需要改回之前的行為,需要在ini里設(shè)置assert.exception=0。
與類名相同的方法名不被當(dāng)作構(gòu)造方法,類的構(gòu)造方法需用__construct()。
不允許通過靜態(tài)調(diào)用的方式調(diào)用非靜態(tài)方法。因此is_callable()在檢查具有類名的非靜態(tài)方法時會失敗(必須檢查對象實例)。
已刪除對對象使用array_key_exists()函數(shù)的能力。可以使用isset()或者property_exists()函數(shù)替代。
在沒有父級的類中使用父級聲明會造成嚴(yán)重的編譯時錯誤。
@運算符不消除嚴(yán)重錯誤(E_ERROR\E_CORE_ERROR\E_COMPILE_ERROR\E_USER_ERROR\E_RECOVERABLE_ERROR\E_PARSE)。使用@時期望error_reporting為0,錯誤處理函數(shù)應(yīng)調(diào)整為使用隱式檢查。注意在生產(chǎn)環(huán)境中不要顯示出錯誤信息,因為這可能導(dǎo)致信息泄露,需確保display_errors=Off與錯誤記錄一同使用。
#[不被解釋為注釋的開始,因為此語法已用于屬性。
data://流封裝器不支持寫入。
連接運算符.的優(yōu)先級相對于位移、加法、減法的優(yōu)先級發(fā)生了變化。

廢除

過濾器string.strip_tags(此過濾器等同于用strip_tags處理所有的流數(shù)據(jù))已廢棄。
read_exif_data()已被廢除;應(yīng)該改用exif_read_data()。exif_read_data()函數(shù)的作用是從一個圖片文件里讀取EXIF頭信息,這樣就可以讀取數(shù)碼相機產(chǎn)生的元數(shù)據(jù)。

總結(jié)

到此這篇關(guān)于PHP5.2.x至PHP8.0.x版本升級新增特性的文章就介紹到這了,更多相關(guān)PHP5.2至PHP8版本特性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論