为什么我应该使用 strtolower() 而不是 mb_strtolower()?

问题描述 投票:0回答:3

我了解

strtolower()
mb_strtolower()
函数之间的用法/行为差异。而且之前已经被问过:)

但我不明白 -

strtolower
目前的目的是什么?

是否因为向后兼容而可用?或者是否有一些使用场景

strtolower
更可取?看起来
mb_strtolower()
更安全,更通用,所以我很想在任何地方使用它......

php
3个回答
10
投票

并不是真正的向后兼容性,而是能够在不额外加载多字节字符串扩展的情况下使用代码。所以这是代码的可移植性问题。

strtolower()
始终可用。仅当加载附加 mbstring 模块时,
mb_strtolower()
才可用。函数重载功能允许使用对
strtolower()
的“通用”调用,如果这样配置,它将实际执行
mb_strtolower()
。所以实际上根本不需要显式编码
mb_strtolower()
...

这使得代码更加可移植,因为它可以在带有或不带有 mbstring 扩展名的系统上运行。


2
投票

strtolower()
是本机函数,与
mb_strtolower()
相比,它始终存在,只有在安装/启用mbstring模块时才可用。

但是对于为什么应该使用其中一个而不是另一个的问题,这很简单。您可以使用它们两者并且仅在

mb_strtolower()
需要并且或可用时使用它们。


如果您编写脚本,则不应在脚本、文件名、数据库结构等中使用任何特殊字符,因为它应该独立于语言以提高可移植性,并且这样做将消除操作系统之间的不一致。脚本在其他环境中的行为可能有所不同,例如,Linux 在 fs/db 操作上区分大小写,而 Windows 则不区分大小写。

脚本应该必须处理自己的特殊字符,因为这是不必要的,而且它会:

  • 性价比,
    strtolower()
    mb_strtolower()
  • 快很多
  • 如果 mbstring 在服务器上不可用,则会失去可移植性。

例如,如果您使用其他系统,例如 PSR-4 自动装载机

$var = new \ns\ÇavA();

将尝试加载“Çava.php”而不是“çava.php”,因为它无法降低大小写,因为它使用本机

strtolower()
函数造成了不稳定。相反,只需保留 ASCII 即可。


mb_strtolower()
应仅用于用户输入/输出,其中
strtolower()
应用于面向系统的大小写格式。

话虽这么说;

strtolower()
足以满足大多数人的需求,即使对于用户输入/输出也是如此,但随之而来的问题是在哪里以及如何应用该数据。请记住,如果它只是为了输出给用户,那么总是有 CSS text-transform 方法。


0
投票

简短回答

  • 您并不总是确定
    mbstring
    扩展在您的环境中可用
  • strtolower()
    明显更快。

再多一点

mbstring
扩展是非默认 PHP 扩展。这意味着它默认情况下未启用,但根据我的经验,我从未遇到过未启用它的托管提供商。

你的问题让我想知道它们在性能上是否会有差异,所以我编写了一个快速基准测试函数,你可以在here找到。

从我对一些随机字符串运行的几次测试来看,似乎

strtolower()
的执行速度至少快了 50 倍。

如果您知道您正在处理与

strtolower()

 兼容的字符串,并且您拥有大量字符串,则可能值得检查 
strtolower()

© www.soinside.com 2019 - 2024. All rights reserved.