2024 年日本 PHP 研討會

函式重載功能

警告

此功能自 PHP 7.2.0 起已被棄用,並自 PHP 8.0.0 起已被移除。強烈建議不要依賴此功能。

您可能經常發現很難讓現有的 PHP 應用程式在給定的多位元組環境中運作。這是因為大多數 PHP 應用程式都是使用標準字串函式(例如 substr())編寫的,而這些函式已知無法正確處理多位元組編碼的字串。

mbstring 支援「函式多載」功能,讓您無需修改程式碼,即可透過多位元組對應函式覆蓋標準字串函式,將多位元組支援新增至應用程式。例如,如果啟用函式多載,則會呼叫 mb_substr() 取代 substr()。此功能讓僅支援單一位元組編碼的應用程式更容易移植到多位元組環境。

要使用函式多載,請在 php.ini 中將 mbstring.func_overload 設定為正值,該值表示指定要多載的函式類別的位元遮罩組合。設定為 1 表示多載 mail() 函式;2 表示字串函式;4 表示正規表示式函式。例如,如果設定為 7,則 mail、字串和正規表示式函式都會被多載。多載的函式列表如下所示。

要多載的函式
mbstring.func_overload 的值 原始函式 多載函式
1 mail() mb_send_mail()
2 strlen() mb_strlen()
2 strpos() mb_strpos()
2 strrpos() mb_strrpos()
2 substr() mb_substr()
2 strtolower() mb_strtolower()
2 strtoupper() mb_strtoupper()
2 stripos() mb_stripos()
2 strripos() mb_strripos()
2 strstr() mb_strstr()
2 stristr() mb_stristr()
2 strrchr() mb_strrchr()
2 substr_count() mb_substr_count()

注意事項:

不建議在每個目錄的設定中使用函式多載選項,因為它在正式環境中的穩定性尚未得到確認,可能會導致未定義的行為。

新增註釋

使用者貢獻的註釋 4 則註釋

匿名
8 年前
這有點邪惡,而且會讓你非常頭痛。
匿名
7 年前
我接手了一個啟用了這個「功能」的專案... 花了我好一段時間才弄清楚為什麼字串的行為不符合語言標準。所以,如果你想讓成年男子哭泣 - 那就盡情啟用這個死亡陷阱吧。
Grandt
10 年前
簡而言之,只有在你 100% 確定你的網站上沒有任何東西依賴於在 PHP 中操作二進位資料時,才使用 mbstring.func_overload。
Oliver Baltz
14 年前
如果您需要為特定目錄(停用)啟用多載,請嘗試在 httpd.conf 中設定適當的 php_admin_value,例如:

<Directory ...>
...
php_admin_value mbstring.func_overload 7
</Directory>

我不百分百確定這是否可靠,但對我來說似乎有效。
To Top