对多字节字符串使用变量函数
Using variable functions for multibyte strings
我有一个有点复杂的搜索和替换算法,它使用许多不同的字符串函数。而不是用这样的东西来填充我的代码:
$mb = true; // use mb functions or not
$len = $mb? mb_strlen($s) : strlen($s);
我正在考虑这样做,就一次:
$_strpos = $mb? 'mb_strpos' : 'strpos';
$_substr = $mb? 'mb_substr' : 'substr';
$_strlen = $mb? 'mb_strlen' : 'strlen';
然后我可以使用这样的代码:
$len = $_strlen($s);
有效。代码更短更清晰,我认为它应该更快。有什么理由不这样做吗?
我能想到一个主要原因:透明度。您和任何未来的开发人员,甚至您的 IDE 都不能 100% 确定最终将调用哪个函数。这是朝着创建不可维护的意大利面条代码迈出的一步。我的建议:不要这样做!
一直使用 mb_
函数有什么问题?如果我明确需要对字节而不是字符进行操作,我只会使用其他函数。作为程序员,您应该知道是否需要对单个字节或字符执行操作。
如果您担心 mbstring 扩展可能无法加载,那么您可以在代码中添加检查。
if (!extension_loaded('mbstring')) {
throw new \Exception('MBString is not loaded as an extension!');
}
我有一个有点复杂的搜索和替换算法,它使用许多不同的字符串函数。而不是用这样的东西来填充我的代码:
$mb = true; // use mb functions or not
$len = $mb? mb_strlen($s) : strlen($s);
我正在考虑这样做,就一次:
$_strpos = $mb? 'mb_strpos' : 'strpos';
$_substr = $mb? 'mb_substr' : 'substr';
$_strlen = $mb? 'mb_strlen' : 'strlen';
然后我可以使用这样的代码:
$len = $_strlen($s);
有效。代码更短更清晰,我认为它应该更快。有什么理由不这样做吗?
我能想到一个主要原因:透明度。您和任何未来的开发人员,甚至您的 IDE 都不能 100% 确定最终将调用哪个函数。这是朝着创建不可维护的意大利面条代码迈出的一步。我的建议:不要这样做!
一直使用 mb_
函数有什么问题?如果我明确需要对字节而不是字符进行操作,我只会使用其他函数。作为程序员,您应该知道是否需要对单个字节或字符执行操作。
如果您担心 mbstring 扩展可能无法加载,那么您可以在代码中添加检查。
if (!extension_loaded('mbstring')) {
throw new \Exception('MBString is not loaded as an extension!');
}