我正在制作一个朋友正在制作游戏的技术树的网站。 tech-three本身只是一个从一个页面到另一个页面的链接列表。每个页面的变量都存储在一个php文件中,例如:mining.php。我不想在一个文件夹中包含大量文件。到目前为止,我所做的只是将它们分成树的第一个分支:
$path = glob('tree/*/'.$page.'.php');
if ($path[0]) {
include $path[0];
理想情况下,我希望能够从树中的任何位置访问该文件 例如:文件mining.php将位于tree / strength / mining.php。而pickaxe.php文件将在tree / strength / mining / pickaxe.php中。但我可以包含任何一个包含相同的内容。我可以用什么来从树文件夹中的任何文件夹或子文件夹中获取我的已知文件名。
答案 0 :(得分:1)
这不是include
的工作方式。如果您想继续,请浏览文件夹并检查是否is_file
,然后您可以include
或更好,require_once
。
答案 1 :(得分:1)
我建议您使用namespaces
这样,您不仅可以在路径上分离您的课程,还可以在概念上分开您的课程。
这是一个例子。假设您在路径树/ strength / mining.php中有类Mining
,如果您给该类namespace Tree\Strength
,您就会立即知道该类所在的位置。您甚至可以使用自动装带器来解析文件并自动加载。
自动加载器示例改编自http://www.php-fig.org/psr/psr-4/examples/
<?php
spl_autoload_register(function ($class) {
$base_dir = __DIR__; //Directory where your "package" lives
$file = $base_dir . str_replace('\\', '/', $class) . '.php';
// if the file exists, require it
if (is_readable($file)) {
require $file;
}
});
每当您要求与课程\Tree\Strength\Mining
有关时,自动加载器就会启动并检查$base_dir/Tree/Strength/Mining.php
是否存在。您可以链接多个自动加载器,但这仅适用于具有相同名称的文件中的类。
答案 2 :(得分:0)
我为自己找到了答案(我花了几个小时但这样可以更容易地对我最终拥有的数百个文件进行排序):
$count = 0;
$path = 'tree/*/';
$file = glob($path.$page.'.php');
while ((strpos($file[0], $page) == false) and ($count != 10)) {
$file = glob($path.$page.'.php');
$path .= '*/';
$count++;
}
if (strpos($file[0], $page) == true) {
include $file[0];
确保您知道自己拥有多少个文件夹并使(count == #)
更高。