PHP: 包含来自未知文件夹的已知文件名

PHP: include known filename from an unknown folder

我正在将一个网站作为一个朋友正在制作的游戏的技术树。技术三本身只是一个从一页到另一页的链接列表。每个页面的变量存储在 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。但是我可以将其中任何一个包含在相同的包含中。我可以使用什么从树文件夹中的任何文件夹或子文件夹中获取我已知的文件名。

include 不是这样工作的。如果您想继续,请遍历文件夹并检查是否 is_file,然后您可以 include,或者更好,require_once

我建议你使用 namespaces

这将允许您不仅在路径上分离您的 classes,而且在概念上分离。

举个例子。假设你在路径 tree/strength/mining.php 中有 class Mining 如果你给 class 一个 namespace Tree\Strength 你立即知道 [=29= 】 住在。您甚至可以使用自动加载器让它解析文件并自动加载它。

自动加载器示例改编自 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;
    }
});

每当您请求与 class \Tree\Strength\Mining 相关的内容时,自动加载器就会启动并检查 $base_dir/Tree/Strength/Mining.php 是否存在。您可以链接多个自动加载器,但这仅适用于同名文件中的 classes。

我自己想出了一个答案(这花了我几个小时,但这将使我更容易整理我最终将拥有的数百个文件):

$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 == #) 更高。