加载目录中的所有文件

时间:2014-05-08 作者:Dannyw24

我做了一个小函数,我想调用目录中的所有文件。

我不认为glob() == false 不过会有用的。我是这个函数的新手,所以不知道所有的可能性,我找到了php。net引用在某种程度上没有帮助。

我期望的结果是,若glob()无法加载任何文件,则可以通过require_once() 对每个文件分别进行。除非有一个更简单更有效的选择,否则这只是一个更大的退路。

if(glob() == false) { echo "0 files found" } else {
    foreach( glob(get_stylesheet_directory() . \'/postypes/*.php\') as $path )
        require_once( $path );
}

1 个回复
最合适的回答,由SO网友:kaiser 整理而成

从目录加载文件-历史方式glob() 函数有三个可能的返回值:

数组(文件名)=> 成功

  • 数组()为空=> 未找到任何内容FALSE => 错误,因此正确的检查是

    $files = glob( sprintf( 
        \'%s/postypes/*.php\',
        get_stylesheet_directory()
    ) );
    if ( empty( $files )
    {
        _e( \'No PHP files found\', \'your-textdomain\' );
    }
    elseif ( ! $files )
    {
        _e( \'Shrug! There went something terribly wrong!\', \'your-textdomain\' );
    }
    else
    {
        foreach ( $files as $file )
            include_once $file;
    }
    
    …buuuut…

    当前获取方式(&N);加载文件-PHP 5.3+

    由于我们已经接近PHP 5.3支持的生命周期,我们可以假设至少有人获得了PHP 5.3。安装了x,因此安装了SPL(标准PHP库)扩展-甚至Ubuntu 12.04 LTS(长期支持)也有5.3打包/Ubuntu当前版本为v14。即使您运行的是PHP 5.2。x、 必须强制关闭SPL。

    苏丹人民解放军DirectoryIterator. 因此,加载文件的良好设置如下所示:

    $it = new DirectoryIterator( sprintf( 
        \'%s/postypes/*.php\',
        get_stylesheet_directory()
    ) );
    
    $it->rewind();
    foreach ( $it as $fileInfo )
    {
        if ( $fileInfo->isDot() )
            continue;
    
        include_once $fileInfo->getFileName();
    }
    
    扩展
  • (编辑)出于某种原因,我将DirectoryIterator 使用FilesystemIterator. 当然,您应该在PHP 5.3中使用后者,因为后者是第一个版本的后续开发。

    好在FilesystemIterator 以及RecursiveDirectoryIterator 具有标志,因此您可以-而不是使用isDot() 方法-只需设置一个标志:

    $it = new FilesystemIterator( __DIR__.\'/assets\', FilesystemIterator::SKIP_DOTS );
    $it = new RecursiveDirectoryIterator( __DIR__.\'/assets\', FilesystemIterator::SKIP_DOTS );
    
    下面是另一个更详细检查的示例:

    # Assume we got this in the functions.php file of a theme
    # and we want to load PHP vendor files.
    $it = new FilesystemIterator(
        __DIR__.\'/vendor/*.php\',
        FilesystemIterator::SKIP_DOTS
        | FilesystemIterator::CURRENT_AS_FILEINFO
    );
    
    $it->rewind();
    while ( $it->valid() )
    {
        if (
            $it->isReadable()
            AND $it->isFile()
            AND $it->current() instanceof \\SplFileInfo
        )
            include_once $it->current()->getFilename()
    
        $it->next();
    }
    
    您还可以使用RecursiveDirectoryIterator 并在那里添加您的图案。确保使用最大深度,以避免搜索过度。

    您还可以使用NoRewindIterator, 这需要Iterator 或者其他什么implements Traversable 并在其上循环。通过这种方式,您可以确保不会对单个文件进行多次迭代。

    $it = new RecursiveDirectoryIterator(
        __DIR__.\'/vendor/*.php\',
        FilesystemIterator::SKIP_DOTS
        | FilesystemIterator::CURRENT_AS_FILEINFO
    );
    $it->rewind();
    $files = new NoRewindIterator( $it );
    $files->rewind();
    foreach ( $files as $file )
        # ...
    
    但这可能太过分了。

    结束

    相关推荐

    主题定制器-动态css PHP文件

    我最近从使用自定义类启用主题选项面板切换到Wordpress中的内置主题定制器。一切都进行得相当顺利-我已经进行了实时预览,但我有点坚持使用“get\\u theme\\u mod()”来检索专用PHP文件中的值。使用我的旧类,我可以将“动态”排队。css。php“where I will include”wp load。php’使我能够使用各种函数获取选项等。Theme Customizer文档显示了在wp\\u head主题的自定义函数中输出动态CSS。除非有必要,否则我真的不想这样做。所以,我现在正