【问题标题】:Convert CamelCase to under_score_case in php __autoload()在 php __autoload() 中将 CamelCase 转换为 under_score_case
【发布时间】:2010-12-08 01:11:35
【问题描述】:

PHP 手册 suggests 自动加载类,如

function __autoload($class_name){
 require_once("some_dir/".$class_name.".php");
}

这种方法可以很好地加载保存在文件my_dir/FooClass.php 中的类FooClass

class FooClass{
  //some implementation
}

问题

如何才能使用_autoload() 函数并访问保存在文件my_dir/foo_class.php 中的FooClass

【问题讨论】:

    标签: php autoload camelcasing


    【解决方案1】:

    你可以像这样转换类名...

    function __autoload($class_name){
        $name = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $class_name));
        require_once("some_dir/".$name.".php");
    }
    

    【讨论】:

    • 这对像 myClassName 这样的类名不会有问题吗?
    • 感谢您的回答 rikh,您的魔法奏效了! @cballou,该代码也适用于您的情况。我在以下类名 FooClass、fooClass、myFooClass 和 MyFooClass 上对其进行了测试。
    • @cballou,不,每次有一个小写字母后跟一个大写字母时,都会在它们之间插入一个下划线。最后,调用 strtolower 以确保最终名称全部小写。
    • 注意:这会将 MyCClassName 转换为 my_cclass_name 而不是 my_c_class_name。
    • 根据@DanielG 的评论,如果您希望除第一个以外的每个大写字母都产生下划线:strtolower(preg_replace('/(?<!^)([A-Z])/', '_$1', $class_name))。这与@rik-heywood 提供的答案之间的唯一区别是 MyCClassName 变为 my_c_class_name 而不是 my_cclass_name。
    【解决方案2】:

    这是未经测试的,但我之前使用过类似的东西来转换类名。我可能会补充一点,我的函数也在 O(n) 中运行,并且不依赖于慢速反向引用。

    // lowercase first letter
    $class_name[0] = strtolower($class_name[0]);
    
    $len = strlen($class_name);
    for ($i = 0; $i < $len; ++$i) {
        // see if we have an uppercase character and replace
        if (ord($class_name[$i]) > 64 && ord($class_name[$i]) < 91) {
            $class_name[$i] = '_' . strtolower($class_name[$i]);
            // increase length of class and position
            ++$len;
            ++$i;
        }
    }
    
    return $class_name;
    

    【讨论】:

    • 如果你摆脱幻数并使用更接近的东西会更干净: if(ord($class_name[$i]) >= ord('A') && ord($类名[$i])
    • 这是真的,但是我打算进行优化,因为在循环中再调用两次 ord() 会稍微有点过度 IMO。
    • $class_name[$i] = '_' 。 strtolower($class_name[$i]); // 什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2012-03-06
    • 2019-01-01
    • 2017-11-28
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多