Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php包含来自文件加载器对象无保留变量_Php_Object - Fatal编程技术网

php包含来自文件加载器对象无保留变量

php包含来自文件加载器对象无保留变量,php,object,Php,Object,首先,我将解释我正在尝试做什么,我正在一个php路由器上工作,以试验它们是如何工作的,在一个对象中,我正在实例化路由器对象,我可以创建路由,没有问题 现在我正在尝试一些更复杂的方法,我希望能够从名为routes的文件夹中包含的文件加载路由,而我事先不知道文件名。还是没问题,很简单 在进行包含时,我想,为什么要将包含保留在对象中,我应该创建一个fileLoader对象,用于从文件夹递归加载文件。我做了,做了一个新的东西 现在,当调用我的loader对象时,应该设置的$router变量不是,并且由于

首先,我将解释我正在尝试做什么,我正在一个php路由器上工作,以试验它们是如何工作的,在一个对象中,我正在实例化路由器对象,我可以创建路由,没有问题

现在我正在尝试一些更复杂的方法,我希望能够从名为routes的文件夹中包含的文件加载路由,而我事先不知道文件名。还是没问题,很简单

在进行包含时,我想,为什么要将包含保留在对象中,我应该创建一个fileLoader对象,用于从文件夹递归加载文件。我做了,做了一个新的东西

现在,当调用我的loader对象时,应该设置的$router变量不是,并且由于变量未定义,我无法创建路由。一段解释代码

这是调用路由器对象的函数:

private function projectRooting(){

        $router = new Router\Router($this->baseUri);

        $fileLoader = new FileLoader();
        $fileLoader -> loadFolder($this->fullDirName, "/routes");

        // include_once($this->fullDirName."/routes/web.php");

        $router->run();
    }
这是fileLoader中的函数:

public function loadFolder(string $path, string $directory){
        $theDirectory = $path. "/" .$directory;
        $files = scandir($theDirectory);

        foreach($files as $file){
            if(is_file($theDirectory. "/" .$file))
                include_once($theDirectory. "/" .$file);
            else{
                if($file != "." && $file != "..")
                    $this->loadFolder($path, $directory. "/" .$file);
            }
        }
    }
包含文件中的路由示例:

$router->get("/", function(){echo "Welcome on the home page!";});
现在对于未注释的代码,它将不起作用,但是如果我注释$fileLoader部分并取消对include_的注释一次,那么一切都会再次进行

当从另一个对象调用include works时,我是否错过了一些东西


如果您回复,请提前感谢,并为我糟糕的英语表示歉意。

我认为您存在范围问题,您的
$route
变量在包含的文件中不可用。尝试使用全局变量范围:

private function projectRooting(){
  global $router;
  $router = new Router\Router($this->baseUri);
  ...
然后,在包含的文件中放入它

global $router;
$router->get("/", function(){echo "Welcome on the home page!";});
它可能必须工作,现在,为什么简单地包含一次工作

问题在于
loadFolder
函数,当您将其称为
include_once
时,此函数中没有对
$router
变量的引用,这意味着如果您将
loadFolder
内容粘贴到
projectRooting
函数中,则它可能会工作


另一种解决方法是通过参数将
$router
传递给
loadFolder
函数。

So
$router->run()对您来说似乎没有定义?有错误吗?没有,$router->run()工作正常。不起作用的是loadFolder include调用的另一个文件中的$route->get methode。谢谢,我今晚将测试它。我曾考虑将$router变量传递给loadFolder,但我希望它能够在任何地方加载文件(大多数情况下使用globals,所以包含works)。我想我会用global测试它,然后尝试其他东西。我用global测试了它,它很有效,所以我会花一些时间看看我是否可以做得不同。