2017-11-10 64 views
2

首先我将解释我正在尝试做什么,我正在研究一个php路由器试验他们如何工作,并在一个对象我instanciating路由器对象和我可以创建路线没有问题。PHP包括从文件加载器对象没有保持变量

现在我正在尝试一些更复杂的事情,我希望能够从文件夹中包含的文件中加载路由,该文件夹名为路由,我不会提前知道文件名。这里仍然没有问题,很简单。

做了我的包容,我想,为什么要将include包含在对象中,我应该创建一个àfileLoader对象,它将专用于递归加载文件夹中的文件。我做了,做了一个新的东西。

现在,当调用我的加载器对象时,应该设置的$ 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部分并取消注释clude_once,一切都会重新开始。

当我从另一个对象调用包含作品的方式时,我是否遗漏了某些东西?

如果您回复,请提前致谢,对不起我的英文不好。

+0

所以'$ router-> run();'似乎对你没有定义?你得到一些错误? – deFreitas

+0

Nop,$ router-> run()工作正常。不起作用的是由loadFolder include调用的另一个文件中的$ route-> get方法。 –

回答

0

我认为你有范围问题,你的$route变量不能在包含文件内部访问。尝试使用全局变量的作用域:

private function projectRooting(){ 
    global $router; 
    $router = new Router\Router($this->baseUri); 
    ... 

然后,你的包含文件中把它

global $router; 
$router->get("/", function(){echo "Welcome on the home page!";}); 

它可能必须的作品,现在,为什么只是include_once作品?

的问题是loadFolder功能,当你把它叫做include_once这里面函数没有提及$router变量,这意味着如果你粘贴所有loadFolder里面的内容projectRooting函数,那么它可能会工作。

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

+0

谢谢,我今天晚上会测试一下。我想过将$路由器变量传递给loadFolder,但我希望它能够在任何地方加载文件(大多数情况下使用全局变量,因此包括作品)。我想我会用全球测试它,并尝试其他的东西。 –

+0

我用全局测试它,它的工作原理,所以我会花一些时间来看看,如果我可以做不同的事情。 –