用于自动加载器的Php简单算法

时间:2014-06-01 13:09:44

标签: php autoload

这是我的简单"算法:

  • 如果该课程被命名为' AaaBbbCccDddEeeFff'这样循环:

    • include/aaa/bbb/ccc/ddd/eee/fff.php
    • include/aaa/bbb/ccc/ddd/eee_fff.php
    • include/aaa/bbb/ccc/ddd_eee_fff.php
    • include/aaa/bbb/ccc_ddd_eee_fff.php
    • include/aaa/bbb_ccc_ddd_eee_fff.php
    • include/aaa_bbb_ccc_ddd_eee_fff.php
  • 如果仍然没有找到,请尝试查看这些文件是否存在:

    • include/aaa/bbb/ccc/ddd/eee/fff/base.php
    • include/aaa/bbb/ccc/ddd/eee/base.php
    • include/aaa/bbb/ccc/ddd/base.php
    • include/aaa/bbb/ccc/base.php
    • include/aaa/bbb/base.php
    • include/aaa/base.php
    • include/base.php

如果仍未找到则错误。

我正在寻找一种快速简便的方法来转换它:

' AaaBbbCccDddEeeFff'

到此:

include/aaa/bbb/ccc/ddd/eee/fff.php

然后轻松删除最新文件夹(我想我应该找explode())。

知道怎么做吗? (我不是要求整个代码,我不是懒惰的。)

4 个答案:

答案 0 :(得分:0)

我认为正则表达式可行。像preg_match_all('[A-Z][a-z][a-z]' , $string);这样的东西可能会起作用 - 它会匹配一个大写字母,后跟一个小写字母和另一个小写字母。

答案 1 :(得分:0)

以下是算法的第一部分:

  

AaaBbbCccDddEeeFff - >
include / aaa / bbb / ccc / ddd / eee / fff.php
  包括/ AAA / BBB / CCC / DDD / eee_fff.php
  包括/ AAA / BBB / CCC / ddd_eee_fff.php
  包括/ AAA / BBB / ccc_ddd_eee_fff.php
  包括/ AAA / bbb_ccc_ddd_eee_fff.php
  包括/ aaa_bbb_ccc_ddd_eee_fff.php

我认为你可以根据我的回答独立完成最后一部分。

<?php

function convertClassToPath($class) {
    return strtolower(preg_replace('/([a-z])([A-Z])/', '$1' . DIRECTORY_SEPARATOR . '$2', $class)) . '.php';
}

function autoload($path) {
    $base_dir = 'include' . DIRECTORY_SEPARATOR;
    $real_path = $base_dir  . $path;
    var_dump('Checking: ' . $real_path);
    if (file_exists($real_path) === true) {
        var_dump('Status: Success');
        include $real_path;
    } else {
        var_dump('Status: Fail');
        $last_separator_pos = strrpos($path, DIRECTORY_SEPARATOR);
        if ($last_separator_pos === false) {
            return;
        } else {
            $path = substr_replace($path, '_', $last_separator_pos, 1);
            autoload($path);                
        }

    }
}

$class = 'AaaBbbCccDddEeeFff';
var_dump(autoload(convertClassToPath($class)));

答案 2 :(得分:0)

由于其他答案都是正则表达式,因此这是完整性的非正则表达方式:

function transform($str){
    $arr = array();
    $part = '';
    for($i=0; $i<strlen($str); $i++){
        $char = substr($str, $i, 1);
        if(ctype_upper($char) && $i > 0){
            $arr[] = $part;
            $part = '';
        }
        $part .= $char;
    }
    $arr[] = $part;

    return 'include/' . strtolower(implode('/', $arr)) . '.php';
}

echo transform('AaaBbbCccDddEeeFff');
// include/aaa/bbb/ccc/ddd/eee/fff.php

这会构建一个文件夹数组,因此您可以根据需要对其进行操作,例如通过取消设置所需的索引来删除文件夹,然后再进行内爆。

答案 3 :(得分:0)

由于您特别要求不要使用整个代码,因此这里有一些代码可以帮助您入门。这将获取输入并将其划分为由大小写更改描述的块。其余的你可以锻炼身体。

<?php
    $input = "AaaBbbCccDddEeeFff";
    $str_so_far = "";
    $last_was_upper = 0;
    $chunks = array(); 
    while($next_letter = substr($input,0,1)) {
        $is_upper = (strtoupper($next_letter)==$next_letter);
        if($str_so_far && $is_upper && !$last_was_upper) {
            $chunks[] = $str_so_far;
            $str_so_far = "";
        }
        if($str_so_far && !$is_upper && $last_was_upper) {
            $chunks[] = $str_so_far;
            $str_so_far = "";
        }
        $str_so_far .= $next_letter;
        $input = substr($input,1);
        $last_was_upper = $is_upper;
    }
    var_dump($chunks);
?>