Php 函数中所需的文件中设置的变量仍然会导致;注意:未定义变量";警告

Php 函数中所需的文件中设置的变量仍然会导致;注意:未定义变量";警告,php,Php,我希望能够包含或需要来自同一父目录(模块)的文件,只需键入要包含的文件的名称,而不必总是写出require\u一次('../app/modules/user/user.php'),因此我想出了一个主意,将其全部封装在函数中,如下所示: index.php文件 //index.php function require_file($modules=array()) { foreach($modules as $

我希望能够包含或需要来自同一父目录(模块)的文件,只需键入要包含的文件的名称,而不必总是写出
require\u一次('../app/modules/user/user.php')
,因此我想出了一个主意,将其全部封装在函数中,如下所示:

index.php文件

//index.php

        function require_file($modules=array())
                {
                    foreach($modules as $module) {
                        if (is_dir('../app/modules/' . $module) && file_exists('../app/modules/' . $module . '/' . $module . '.php')) {
                            require_once('../app/modules/' . $module . '/' . $module . '.php');
                        } else {
                            die('The module <strong>' . $module . '</strong> does not exist in the modules directory');
                        }
                    }
                }

    // and then require my files like this:

        $modules = array();

        $modules[] = 'user';

        require_file($modules);
这是我的user.php文件:

//user.php

$user = 'My Name';
问题就在这里

  • 如果在index.php内部使用user.php文件设置的变量,仍然会抛出注意:未定义变量:user而不会失败
    is\u dir或文件\u exists
    测试,当失败时,它会输出一个骰子消息,说明“模块用户在模块目录中不存在”就像它应该的那样

  • 当我在函数后面需要文件时,检查该文件之前是否需要一次,如下所示:

  • index.php

        function require_file($modules=array())
                {
                    foreach($modules as $module) {
                        if (is_dir('../app/modules/' . $module) && file_exists('../app/modules/' . $module . '/' . $module . '.php')) {
                            require_once('../app/modules/' . $module . '/' . $module . '.php');
                        } else {
                            die('The module <strong>' . $module . '</strong> does not exist in the modules directory');
                        }
                    }
                }
    
    // and then require my files like this:
    
        $modules = array();
    
        $modules[] = 'user';
    
        require_file($modules);
    
        require_once('../app/modules/user/user.php');
    
    函数需要_文件($modules=array())
    {
    foreach($modules作为$module){
    如果(is_dir('../app/modules/'.$module)&&file_存在('../app/modules/'.$module./'.$module.'.php')){
    需要_一次('../app/modules/'.$module./'.$module..php');
    }否则{
    die('module'.$module.在modules目录中不存在');
    }
    }
    }
    //然后像这样要求我的文件:
    $modules=array();
    $modules[]=“用户”;
    需要_文件($modules);
    需要_once('../app/modules/user/user.php');
    
    它不起作用,因为显然它以前已经被要求过一次了


    问题是…我做错了什么

    变量
    $user
    require\u文件
    功能范围中定义。这是引起注意的原因

    您需要在
    user.php
    文件中将
    $user
    声明为global变量:

    //user.php
    全球$用户;
    $user='My Name';
    

    不过这不是个好主意。您应该将模块创建为类。如果您忘记了本模块中的变量
    $user
    ,而在另一个模块中声明了另一个
    $user
    变量,则会产生干扰。

    因此,您向我们展示了除
    user.php
    之外的所有内容。你想让我们猜猜是什么?它就在那里…有一个设置变量$user。你可能想了解一下哪些基本上就是你所需要的(在类的上下文中)项目不是面向对象的…我还在学习php。你能告诉我怎么做吗?答案是经过编辑的。如果您不需要加载类,自动加载程序将不起作用。@GermanLashevich这些文件可以很容易地编辑成类,从长远来看这将是最好的选择。OP正在学习PHP这是学习OOP的最好时机,而不是在学习过程之后。。。它避免了不良习惯,如
    全球
    @Martin你是对的。但有两个方面:解决当前任务和学习最佳实践。当前问题的背景还不够清楚,无法说明如何准确地重写代码以使用类。在探索了如何使用类的选项之后,我发现没有太多的东西值得去做,所有这些都是对最佳实践的某种破坏。闭包可能是一种方法,但会将各种新变量添加到函数中,文件内容需要使用eval等。
    
        function require_file($modules=array())
                {
                    foreach($modules as $module) {
                        if (is_dir('../app/modules/' . $module) && file_exists('../app/modules/' . $module . '/' . $module . '.php')) {
                            require_once('../app/modules/' . $module . '/' . $module . '.php');
                        } else {
                            die('The module <strong>' . $module . '</strong> does not exist in the modules directory');
                        }
                    }
                }
    
    // and then require my files like this:
    
        $modules = array();
    
        $modules[] = 'user';
    
        require_file($modules);
    
        require_once('../app/modules/user/user.php');