php包含来自文件加载器对象无保留变量
首先,我将解释我正在尝试做什么,我正在一个php路由器上工作,以试验它们是如何工作的,在一个对象中,我正在实例化路由器对象,我可以创建路由,没有问题 现在我正在尝试一些更复杂的方法,我希望能够从名为routes的文件夹中包含的文件加载路由,而我事先不知道文件名。还是没问题,很简单 在进行包含时,我想,为什么要将包含保留在对象中,我应该创建一个fileLoader对象,用于从文件夹递归加载文件。我做了,做了一个新的东西 现在,当调用我的loader对象时,应该设置的$router变量不是,并且由于变量未定义,我无法创建路由。一段解释代码 这是调用路由器对象的函数:php包含来自文件加载器对象无保留变量,php,object,Php,Object,首先,我将解释我正在尝试做什么,我正在一个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测试了它,它很有效,所以我会花一些时间看看我是否可以做得不同。