Почему я должен использовать 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().