Переопределение строковых функций PHP по умолчанию с помощью функций mb_string

Поэтому я разместил несколько вопросов, связанных с обновлением уже существующего программного обеспечения, написанного на PHP, для поддержки unicode/utf8. Одним из решений является переопределение строковых функций PHP по умолчанию функциями PHP mb_string. Тем не менее, я вижу, что многие люди говорят о негативных последствиях, но никто не останавливается на них. Может кто-нибудь объяснить, что это за негативные последствия?

Почему «плохо» переопределять строковые функции PHP по умолчанию функциями mb_string? В конце концов, это намного проще, чем вручную заменять все эти функции соответствующими им функциями mb_. Итак, что мне не хватает? Что это за негативные последствия?


person J Johnson    schedule 24.03.2013    source источник
comment
Дублируйте stackoverflow.com/questions/12045940/ но другие ответы не особенно хороши.   -  person Danack    schedule 24.03.2013


Ответы (3)


Плохо переопределять их, потому что, если какой-то другой разработчик придет и поработает над этим кодом, он может сделать что-то, чего он не ожидал. Всегда полезно использовать функции по умолчанию так, как они были задуманы.

person Ryan Knopp    schedule 24.03.2013

Я думаю, что семейная функция mb_* тяжелее, поскольку они также выполняют тест юникода даже для простой строки ascii. Таким образом, в больших масштабах они замедлят скорость вашего приложения. (Может, не по особому значению, но как-то определенно.)

person kuldeep.kamboj    schedule 24.03.2013

Я постараюсь уточнить.

Перегрузка стандартных строковых функций с помощью mb_* будет иметь ужасные последствия для всего, что читает и работает с двоичными файлами или двоичными данными в целом. Если вы перегружаете стандартную функцию, то вдруг strlen($binData) в какой-то момент обязательно вернет неправильную длину.

Почему?

Представьте, что двоичные данные содержат байт со значением в диапазонах 0xC0-0xDF, 0xE0-0xEF или 0xF0-0xF7. Это стартовые байты Unicode, и теперь перегруженный strlen будет считать следующие символы за 1 байт, а не за 2, 3 и 4, как они должны были быть соответственно.

И главная проблема в том, что mbstring.func_overload глобальный. Это влияет не только на ваш собственный скрипт, но и на все скрипты, а также любые фреймворки или библиотеки, которые они могут использовать.

Когда меня спросят, должен ли я включить mbstring.func_overload. Ответ всегда и ДОЛЖЕН всегда быть решительным НЕТ.

Вы чертовски облажались, если воспользуетесь им, и вы потратите бессчетное количество часов на охоту за ошибками. Ошибки, которые вполне могут быть неисправимыми.

Что ж, вы МОЖЕТЕ вызвать mb_strlen($string, 'latin1'), чтобы заставить его работать, но он по-прежнему содержит накладные расходы. strlen использует тот факт, что строки php похожи на строки Java; они знают свою длину. mb_strlen анализирует строку для подсчета байтов.

person A.Grandt    schedule 28.08.2015