Почему я должен использовать strtolower(), а не mb_strtolower()?
Я понимаю разницу в использовании/поведении между функциями strtolower()
и mb_strtolower()
. И он был задан до:)
Но я не понимаю - какова текущая цель strtolower
?
Доступно ли это из-за обратной совместимости? Или есть некоторые варианты использования, когда strtolower
является предпочтительным? Кажется, что mb_strtolower()
более безопасен и более универсален, поэтому я испытываю соблазн использовать его везде...
Ответы
Ответ 1
Не совсем обратная совместимость, но возможность использовать код с дополнительно загруженным расширением многобайтовой строки. Так что вопрос о переносимости кода.
strtolower()
всегда доступен. mb_strtolower()
доступен только в том случае, если загружен дополнительный модуль mbstring. Функция перегрузки функции позволяет использовать "общий" вызов strtolower()
, который фактически выполнит mb_strtolower()
, если он настроен таким образом. Таким образом, на самом деле нет необходимости явно кодировать mb_strtolower()
вообще...
Это делает код более переносимым, поскольку он может работать в системах с расширением mbstring или без него.
Ответ 2
strtolower()
является встроенной функцией и всегда будет там по сравнению с mb_strtolower()
, которая доступна только в том случае, если модуль mbstring установлен \enabled.
Но на вопрос, почему нужно использовать друг друга, хорошо, что довольно просто. Вы можете использовать их и и использовать mb_strtolower()
только тогда, когда это необходимо и/или доступно.
Если вы script что-то не должны использовать любые специальные символы в сценариях, именах файлов, структурах db и т.д., так как он должен быть независимым от языка для улучшения переносимости и тем самым устраняет несогласованность между операционные системы. Сценарии могут вести себя по-разному в других средах, например, Linux чувствительна к регистру на fs/db, где Windows не является.
A script должен не иметь дело со своими специальными символами, поскольку он не нужен, и он будет:
- Эффективность затрат
strtolower()
намного быстрее, чем mb_strtolower()
- Потерять переносимость, если mbstring недоступна на сервере.
Например, если вы используете другие системы, такие как автозагрузчик PSR-4.
$var = new \ns\ÇavA();
Будет пытаться загрузить "Çava.php" вместо "çava.php", потому что он не позволяет опустить регистр из-за того, что он использует встроенные функции strtolower()
, создавая непостоянство. Вместо этого просто сохраните ASCII.
mb_strtolower()
следует использовать только для ввода/вывода пользователя, где strtolower()
следует использовать для форматирования в системном формате.
Это сказано; strtolower()
будет достаточно для большинства людей, даже для ввода/вывода пользователя, но затем возникает вопрос, где и как вы применяете эти данные. Имейте в виду, что если его просто для вывода пользователю, всегда существует метод text-transform.
Ответ 3
Короткий ответ
- Вы не всегда уверены, что расширение
mbstring
будет доступно в вашей среде.
-
strtolower()
значительно быстрее.
Немного больше
Расширение mbstring
не является расширением PHP по умолчанию. Это означает, что он не включен по умолчанию, хотя, по моему опыту, я никогда не сталкивался с хостинг-провайдером, у которого его не было.
Ваш вопрос заставил меня задаться вопросом, будут ли они иметь разницу в производительности, поэтому я написал быструю контрольную функцию, которую вы можете найти здесь.
Из нескольких тестов я запускал некоторые случайные строки, кажется, что strtolower()
не менее 50 раз быстрее в нем.
Если вы знаете, что имеете дело со строками, совместимыми с strtolower()
, и у вас их действительно много, возможно, стоит рассмотреть strtolower()
.