从目录加载文件-历史方式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 )
# ...
但这可能太过分了。