north_leshiy
@north_leshiy
Руководитель направления разработки

Как правильно работать с мультибайтовыми строками в php7 и чем плох func_overload?

Должен ли я использовать mb_strpos если у меня utf-8 кодировка на проекте? Или в 7.х версиях PHP strpos будет корректно работать и в utf-8 кодировке при работе с символами?

Какие баги можно словить если func_overload >=2 (причина почему symphony запретил использование).

Я прочитал https://wiki.php.net/rfc/deprecations_php_7_2, но мне не хватает деталей для собственного, внутреннего понимания.
  • Вопрос задан
  • 365 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Всё очень просто.
Использование func_overload меняет работу стандартных функций. Например, strlen после этого начинает возвращать длину строки не в байтах, а в символах. Соответственно, библиотеки, полагающиеся на стандартное поведение функций, будут работать некорректно. Поэтому func_overload запретили и, если вам нужны мультибайтовые строки, то надо напрямую использовать библиотеку mbstring.
Ответ написан
Adamos
@Adamos
Для внутреннего понимания: strpos в РНР - это тупая обертка над С-функцией, принимающей в качестве аргументов два char* и выдающая в ответе количество байт, через которое второй массив байт совпал с первым.
Она знать ничего не знает ни о каких кодировках, и это хорошо, но не то, что вам нужно.
func_overload - это костыль для легаси-кода, в котором люди, не думающие о будущем, обрабатывают строки так, как будто они всегда будут однобайтными. Воцарение UTF-8 нарушило эту идиллию, а переписывать тонны кода зачастую просто некому - вот и подперли проблему настройкой, которая подсовывает mb_-функции вместо архаичных.
Если вы пишете новый код и он работает со строками, а не с потоками байт - вам следует забыть об этих функциях и никогда не использовать ничего, кроме mb_*, в коде.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы