update page now

Механизм перегрузки функций

Внимание

Начиная с PHP 7.2.0 функциональность УСТАРЕЛА, а в PHP 8.0.0 функциональность УДАЛИЛИ. Полагаться на функциональность настоятельно не рекомендуют.

Зачастую заставить работать существующее PHP-приложение в многобайтовом окружении становится трудоёмкой задачей. Причина состоит в том, что большую часть PHP-приложений написали со стандартными функциями обработки строк наподобие substr(), которые не умеют работать со строками в многобайтовых кодировках.

Модуль mbstring поддерживает механизм «перегрузки функций», который сообщает приложению о работе с многобайтовой кодировкой, без модификации кода, который отвечает за работу со строками. Например, при включении перегрузки функций вместо функции substr() вызывается функция mb_substr(). Этот механизм часто помогает переносить в многобайтовое окружение приложения, которые поддерживают только однобайтовые кодировки.

Для активации механизма перегрузки функций потребуется задать настройке mbstring.func_overload в php.ini положительное значение, которое представляет собой комбинацию битовых масок для определения категорий функций, которые требуется перегружать. Число 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 notes

up
55
Anonymous
9 years ago
it's kinda evil and gives you tons of headache.
up
41
Anonymous
8 years ago
I took over a project with this "feature" enabled... took me a while to figure out why strings behaved non language standard. So, if you like to make grown men cry - by all means enable this deathtrap.
up
18
Grandt
11 years ago
In short, only use mbstring.func_overload if you are 100% certain that nothing on your site relies on manipulating binary data in PHP.
up
-2
Oliver Baltz
15 years ago
In case you need to (de)activate the overloading for a specific directory, try setting an appropriate php_admin_value in your httpd.conf, e.g.

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

I'm not 100% sure if one can rely on that, but it seems to work for me.
To Top