Я постараюсь уточнить.
Перегрузка стандартных строковых функций с помощью 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