[PHP] PHP 7.2 被棄用的功能


這是多個對 PHP 7.2 的棄用的 RFC 草案。該 RFC 列出建議在 PHP 7.2 棄用的功能,預計最晚在 PHP 8.0 刪除。

以下列表簡要介紹了棄用的功能,而“提案”部分提供了更詳細的說明:

PHP 7.2 棄用功能

  • __autoload
  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • (unset)
  • parse_str() 沒有第二個參數
  • gmp_random()
  • each()
  • assert() 用字符串參數
  • $errcontext 錯誤處理程序的參數


以下將逐一說明棄用之原因。

__autoload

__autoload 魔術方法,已經被 PHP 5.1 中的 spl_autoload_register 取代,並且在文檔中不建議使用。spl_autoload register() 的一個主要優點,是能夠提供多個組合的自動加載器,從而降低庫的互操作性。這兩種加載機制是互斥的,使用 \_autoload 的代碼不能與使用 spl_autoload register 代碼交互操作。由於後者更常用,並且也被 Composer 使用,所以 \_autoload() 機制現在僅具有非常有限的適用性。
 

create_function()

create_function() 是對eval() 的簡單包裝。此函數可以創建一個函數,函數的參數列表和函數主體作為字符串參數傳入。在PHP 5.3 引入閉包之前,它提供了一種創建近似於lambda 函數的方法。

由於其操作的性質,create_function() 除了是潛在的安全問題來源之外,還具有非常差的性能和內存使用特性。在各種情況下,使用真正的閉包是首選。
 

mbstring.func_overload


在 ini 中設置 mbstring.func_overload 會允許用 mbstring 擴展中的相似功能替換掉字符串函數的子集。例如,strlen() 將不再返回以字節為單位的字符串長度,而是根據當前選擇的內部編碼返回代碼點中的長度。

這意味著使用 mbstring.func_overload 的代碼,幾乎都不兼容跟所有在基本字符串操作正常工作的假設下所編寫的代碼。一些庫完全禁止 func_overload (例如 Symfony),其它的則會出現一些不可察覺的行為變化。希望支持 func_overload 的代碼需要有在普通字符串函數和具有 8 位編碼的 mbstring 函數之間切換的條件(但是,通常只有加密庫才會這麼做)。

(unset)cast

(unset)cast 轉換一個值為null。

這表示(unset)expr 只是一個總返回null 並且沒有其它副作用的表達式。除了無用以外,也容易讓人懵逼。很多人合理的假設(unset)$a 的行為類似於unset($a) ,而實際上沒那麼回事。
 

parse_str()不傳入第二個參數

parse_str() 函數用於將查詢字符串解析為第二個參數傳入的數組,如果沒有傳入,則解析為本地符號表。

第二種行為是來自register_globals 黑暗時代的殘餘。當處理用戶提供的數據時,存在嚴重的安全隱患。
 

gmp_random()

gmp_random() 函數返回一個 0 到2**($n*BITS_PER_LIMB)-1 之間的隨機GMP 數,其中$n 是函數參數,BITS_PER_LIMB 是GMP/MPIR 實現的平台特定參數,未向用戶公開。因此,使用此功能需要猜測limb 大小,並且有平台依賴性。

作為補救PHP 5.6 引入了可以精確控制使用的隨機數範圍的gmp_random_bits() 和gmp_random_range() 函數。應始終優先使用這些函數,而不是gmp_random()。
 

each()

each() 函數被用於遍歷一個數組,類似於 foreach。每次調用時返回一個具有當前 key 和value 的數組,並將內部數組指針移動到下一個位置。手冊中介紹的基本用法如下:

reset($array);
while (list($key, $val) = each($array)) {
    echo "$key => $val\n";
}
each() 函數不如 foreach,並且比它慢十倍。

assert()傳入字符參數

assert() 函數具有兩種操作模式:如果它傳入的不是字符串,它會斷言該值是否為真。如果傳入一個字符串則先執行eval(),然後檢查eval() 的結果是否為真。

在PHP 7 之前,這種行為是阻止斷言表達式求值的唯一方法。從PHP 7 開始,可以在ini 中設置zend.assertions 的值,來避免對斷言表達式求值。因此,不再需要支持隱式評估的字符串參數。

assert() 的這種行為使得很容易引入微妙的遠程代碼執行漏洞。

錯誤處理器的$errcontext參數

$errcontext 是使用set_error_handler() 設置錯誤處理程序時的最後一個參數。此參數為包含錯誤生成處的所有局部變量的數組。

這個功能對於優化有影響,因為$errcontext 可用於修改當前範圍中的所有引用和變量。據我所知,這個功能幾乎無用,這裡的權衡是不值得的。如果人們希望在錯誤的時候檢查變量狀態,他們應該使用適當的調試器。

請注意,錯誤上下文僅包含錯誤發生處的局部變量。包含$this 和函數參數的錯誤回溯,會通過debug_backtrace() 保持可用。

 

回上一頁

相關文章:

喜歡這篇文章嗎?立即分享

Posted : / Views: 292