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,则将重载邮件、字符串和正则表达式函数。重载函数列表如下所示。

要重载的函数
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