2024 年日本 PHP 研討會

PHP 7.2.x 中已棄用的功能

未加引號的字串

不存在的全域常數的未加引號字串將被視為自身的字串。這種行為過去會發出 E_NOTICE,但現在會發出 E_WARNING。在 PHP 的下一個主要版本中,將會拋出 錯誤 例外。

<?php

var_dump
(NONEXISTENT);

/* 輸出:
警告:使用未定義的常數 NONEXISTENT - 假設為 'NONEXISTENT'(在未來的 PHP 版本中,這將會拋出錯誤) 於 %s 的第 %d 行
字串(11) "NONEXISTENT"
*/

png2wbmp()jpeg2wbmp()

GD 擴充套件中的 png2wbmp()jpeg2wbmp() 函式已被棄用,並將在下一個主要版本的 PHP 中移除。

INTL_IDNA_VARIANT_2003 變體

Intl 擴充套件已棄用 INTL_IDNA_VARIANT_2003 變體,目前它被用作 idn_to_ascii()idn_to_utf8() 的預設值。 PHP 7.4 將把這些預設值更改為 INTL_IDNA_VARIANT_UTS46,而下一個主要版本的 PHP 將完全移除 INTL_IDNA_VARIANT_2003

__autoload() 方法

__autoload() 方法已被棄用,因為它不如 spl_autoload_register()(因為它無法鏈式自動載入器),並且兩種自動載入樣式之間沒有互通性。

track_errors ini 設定和 $php_errormsg 變數

當啟用 track_errors ini 設定時,如果發生非致命錯誤,則會在局部作用域中建立 $php_errormsg 變數。由於擷取此類錯誤資訊的首選方法是使用 error_get_last(),因此此功能已被棄用。

create_function() 函式

鑒於此函式(作為 eval() 的精簡包裝器)的安全問題,此過時的函式現已被棄用。首選的替代方法是使用匿名函式

mbstring.func_overload ini 設定

由於在啟用此設定的環境中使用基於字串的函式會產生互通性問題,因此現已棄用此設定。

(unset) 類型轉換

將任何表達式轉換為此類型將始終產生 null,因此此多餘的類型轉換現已被棄用。

不帶第二個參數的 parse_str()

如果沒有 parse_str() 的第二個參數,查詢字串參數將填入局部符號表。由於此操作的安全隱患,不帶第二個參數使用 parse_str() 現已被棄用。應該始終使用帶兩個參數的此函式,因為第二個參數會導致查詢字串被解析為陣列。

gmp_random() 函式

此函式根據由未公開的、平台特定的肢體大小計算的範圍生成一個隨機數。因此,此函式現已被棄用。使用 GMP 擴充套件生成隨機數的首選方法是使用 gmp_random_bits()gmp_random_range()

each() 函式

此函式的迭代速度比普通的 foreach 慢得多,並且會導致某些語言更改的實作問題。因此它已被棄用。

使用字串參數的 assert()

使用帶有字串參數的 assert() 函式需要對該字串進行 eval() 評估。鑒於遠端程式碼執行的潛在風險,使用帶有字串參數的 assert() 函式現已棄用,建議改用布林運算式。

錯誤處理器的 $errcontext 參數

$errcontext 參數包含錯誤發生位置的所有局部變數。由於其使用率低,且會造成內部優化的問題,現已棄用。建議使用除錯器來檢索錯誤發生位置的局部變數資訊。

read_exif_data() 函式

read_exif_data() 別名已棄用。應改用 exif_read_data() 函式。

新增註解

使用者貢獻的註解 2 則註解

匿名
6 年前
在 PHP 7.2.0 中,空的 <?php?> 程式碼區塊會發出「未加引號的字串」警告。為了避免這種情況,請在程式碼區塊中至少新增一個空格。

範例
<?php

<?php/*
echo "This was some useful code.\n";
*/
?>

?>
會產生:PHP 警告:使用未定義的常數 php - 假設為 'php'(這在未來的 PHP 版本中將會引發錯誤)

透過以下方式修正
<?php

<?php /*
echo "This was some useful code.\";
*/
?>

?>

不知道這是刻意設計的行為還是副作用。
webmaster at thedigitalorchard dot ca
6 年前
根據文件說明,您可以輕鬆地使用 spl_autoload_register() 來取代 __autoload()

spl_autoload_register(function ($class) {
include 'classes/' . $class . '.class.php';
});

這樣您就可以擁有多個自動載入器,而不是一個全域的自動載入器。
To Top