是否可以使用get_defined_vars()获取变量但是对于实际运行的脚本?

时间:2014-06-27 09:56:13

标签: php variables scope defined

我正在尝试创建一个函数来获取所有用户定义的变量,有选择地在脚本实际完成之前取消它们。为了获得所有使用的变量,你必须使用PHP提供的get_defined_vars()函数,但它有一个警告(对我来说,至少......):它只能在它实际调用的范围内工作。 / p>

理想情况下,我希望将其封装在我的框架核心命名空间内的函数中,即\Helpers\Core,因此该函数将为\Helpers\Core\getVariables()

实际上,我的代码看起来像这样:

foreach (array_diff(array_keys(get_defined_vars()), ["_COOKIE", "_ENV", "_FILES", "_GET", "_POST", "_REQUEST", "_SERVER", "_SESSION", "argc", "argv", "GLOBALS", "HTTP_RAW_POST_DATA", "http_response_header", "ignore", "php_errormsg"], ["page"]) as $variable) {
    unset($$variable);
}

基本上,它试图通过以下方式自动化变量选择:

  • 使用array_keys(get_defined_vars())
  • 获取所有变量名称
  • 定义一组保留或系统范围的变量,例如$_GET$_POST$_SERVER等等
  • 提供您保留的哪些变量(在此示例中为$page

问题是我不希望在每个我想摆脱一些变量的地方放置这段代码。理想情况下,我希望能够将其定义为一个函数并自动使用它,但是......有没有办法实现这一点但是在当前脚本中你从中调用函数?

1 个答案:

答案 0 :(得分:2)

您可以使用$GLOBALS代替get_defined_vars()来访问全局范围并取消设置全局变量:

$non_user_vars = ["_COOKIE", "_ENV", "_FILES", "_GET", "_POST", "_REQUEST", 
                  "_SERVER", "_SESSION", "argc", "argv", "GLOBALS",
                  "HTTP_RAW_POST_DATA", "http_response_header",
                  "ignore", "php_errormsg"];

$safe_user_vars = ["page"];

$all_vars = array_keys($GLOBALS);

$user_vars = array_diff($all_vars, $non_user_vars, $safe_user_vars);

foreach($user_vars as $variable) {
    unset($GLOBALS[$variable]);
}

对此方法的快速警告:

  1. 为了使它更清洁,我首先定义了数组。这可能导致他们进入你的$user_vars数组(如果它们不是全局的话,认为它不应该这样),所以要防止这种情况,以避免抛出错误或其他后果。

  2. 您的非用户变量数组并非详尽无遗,因为当我测试上述内容时,我仍然得到:

    Array
    (
        [2] => HTTP_ENV_VARS
        [6] => HTTP_POST_VARS
        [8] => HTTP_GET_VARS
        [10] => HTTP_COOKIE_VARS
        [12] => HTTP_SERVER_VARS
        [14] => HTTP_POST_FILES
        [16] => test
        [17] => non_user_vars
    )
    
  3. 如果您不想猜测哪个是预先定义的或在运行时可见,可能会有\Helpers\Core\getVariables()的初始调用获取变量列表并静态存储它们{{1只需要在最后用列表区分初始列表,以了解用户定义的内容。