例如,我有一个像这样的目录结构:
my_stuff
classes
one
two
more
evenmore
manymore
subsub
subsubsub
otherstuff
morestuff
deepstuff
toomuch
我希望将类下的所有内容(!)添加到php include路径中。我怎么会得到这样的阵列?有没有一些花哨的php功能呢?
答案 0 :(得分:6)
使用SplIterators可轻松递归遍历目录。你刚才做了
$path = realpath('.');
$elements = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($path),
RecursiveIteratorIterator::SELF_FIRST);
foreach($elements as $element){
// element is an SplFileObject
if($element->isDir()) {
echo "$element\n"; // do whatever
}
}
但是,请勿将每个目录添加到包含路径。
如果将所有这些文件夹添加到包含路径,则会严重降低应用程序的速度。如果您的类在subsubsub中,PHP将首先搜索my_stuff,然后搜索类,然后搜索一个,然后搜索两个,依此类推。
而是让您的类名遵循PEAR约定并使用自动加载。
见
答案 1 :(得分:0)
不是我知道的。因此,您必须编写自己的递归函数,使用dir或类似函数。
但是,你真的想在某个地方缓存这些路径,因为这(至少对我来说)感觉就像是为每个前端页面加载执行不必要的资源密集型活动。 (例如,根据您过去所说的内容,您可能只需要在更改CMS中的逻辑时重新生成包含目录列表等。)
或者,您可以在中间级别生成负责包含较低级别项目的项目。 (如果您正在使用工厂模式等,这可能真的有意义,但可能并非如此。)
答案 2 :(得分:0)
function include_sub_dirs($path) {
if (!isDirectory($path)) {
trigger_error("'$path' is not a directory");
}
$old = get_include_path();
foreach (scandir($path) as $subdir) {
if (!is_directory($subdir)) continue;
$path .= PATH_SEPARATOR . $path.DIRECTORY_SEPARATOR.$subdir;
include_sub_dirs($subdir);
}
set_include_path($old . PATH_SEPARATOR . $path);
return true;
}