2

我想循环主目录中的所有子目录,例如,我保留所有类,

core/
   model/
       page/
          class_1.php
          class_2.php
       menu/
          class_3.php
       and so on...

所以这是我的自动加载函数,我将它放在 init.php 中,

function autoload_multiple_directory($class_name){

    // List all the class directories in the array.
    $array_directories = array(
        'core/controller/', 
        'core/model/',
        'core/helper/'
    );

    // When you use namespace in a class, you get something like this when you auto load that class \foo\tidy.
    // So use explode to split the string and then get the last item in the exloded array.
    $parts = explode('\\', $class_name);
    //print_r($parts);

    // Set the class file name.
    $file_name = strtolower(end($parts)).'.php';
    // $file_name = 'class_'.strtolower($class_name).'.php';

    // Loop the array.
    foreach($array_directories as $path_directory){


        $recursive_directory = new RecursiveDirectoryIterator($path_directory);
        foreach (new RecursiveIteratorIterator($recursive_directory) as $filename => $file) {

            if(file_exists(WEBSITE_DOCROOT.$file->getPath().'/'.$file_name)){

                include WEBSITE_DOCROOT.$file->getPath().'/'.$file_name;
            } 

        }


        /* no problem with this, but I cannot loop the sub dirs...
        if(file_exists(WEBSITE_DOCROOT.$path_directory.$file_name)){

            include WEBSITE_DOCROOT.$path_directory.$file_name;
        }
         * 
         */
    }
}


spl_autoload_register('autoload_multiple_directory');

但随后我收到此错误消息,

致命错误:无法在第 6 行的 C:\wamp\www\xxx\core\helper\Common.php 中重新声明类 Common

我的项目中只有一Common门课。为什么说不止一次重新声明

但是,如果您查看if(file_exists(WEBSITE_DOCROOT.$path_directory.$file_name))我注释掉的内容-加载类没有问题。这个初始循环的问题是它不会循环主目录中的子目录,例如,core/model/

任何想法为什么以及我应该怎么做才能循环主目录的子目录?

编辑:

问题来自RecursiveDirectoryIterator- 它循环目录并列出所有文件。但我想要的只是子目录。

4

2 回答 2

1

这些文件夹中是否存在多个Common.php文件副本?
因为您的代码break在包含类文件后autoloader不会继续在文件夹树中寻找具有相同名称的其他文件,并且会导致Fatal error: Cannot redeclare class XXX错误。添加break可以解决问题。

// Loop the array.
$isClassFound = false;
foreach($array_directories as $path_directory){
    $recursive_directory = new RecursiveDirectoryIterator($path_directory);
    foreach (new RecursiveIteratorIterator($recursive_directory) as $filename => $file) {
        if(file_exists(WEBSITE_DOCROOT.$file->getPath().'/'.$file_name)){
            include WEBSITE_DOCROOT.$file->getPath().'/'.$file_name;
            $isClassFound = true;
        }
        if ($isClassFound) break;
    }
    if ($isClassFound) break;
}

但是,您的性质autoloader似乎不允许任何重复的类文件名。也许您可以编写一个名称重复检查器来保证唯一性。

编辑:

class_exists()从答案中删除了该部分,因为使用它没有多大意义。无论如何,既然您看到了我的答案的那个版本,并且您通过评论问我在哪里放置class_exists(),我将恢复代码示例。您可以在autoloader.

if (class_exists($class_name,false)) // give false to avoid automatic loading
    return;
于 2013-09-17T07:39:34.850 回答
-1

打开开始菜单。在文本框中 write cmd,等待cmd程序弹出,然后按 Enter。

一旦终端窗口打开,导航到您的根文件夹,然后对类的名称进行递归搜索(通过所有文件和文件夹):

cd C:\wamp\www\xxx
findstr /SNIP /C:"class common" *.php

类的声明应该不止一个。

于 2013-09-17T08:43:22.543 回答