代码之家  ›  专栏  ›  技术社区  ›  night-gold

php include from file loader object no keeping变量

  •  2
  • night-gold  · 技术社区  · 8 年前

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

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

    在进行包含时,我想,为什么要将包含保留在对象内,我应该创建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();
        }
    

    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!";});
    

    当从另一个对象调用时,我是否在包含作品的方式中遗漏了什么?

    如果您回复,请提前感谢,很抱歉我的英语很差。

    1 回复  |  直到 8 年前
        1
  •  0
  •   deFreitas    8 年前

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

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

    然后,在你包含的文件中放入

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

    它可能必须工作,现在,为什么简单的include_一旦工作?

    问题是 loadFolder 函数,当您将其称为 include_once 此函数内部没有引用 $router 变量,这意味着如果您粘贴所有 加载文件夹 内部内容 projectRooting 然后它可能会工作。

    另一种解决方法是通过 $路由器 加载文件夹 作用