2017-11-10 25 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

我用全局測試它,它的工作原理,所以我會花一些時間來看看,如果我可以做不同的事情。 –