通过函数中包含的文件内部的引用分配的全局变量


Global variable assigned by reference inside a file included in a function

下面是某个第三方模块如何将第三方应用程序添加到页面中的简化示例。应用程序通常是独立的,可以直接访问,但模块使用一个函数将应用程序包含在特定的URL中。

module.php:

if ($path == 'some/specific/url') {
  load_app();
}
function load_app() {
  include('./app.php');
}

app.php:

// For this example, assume $_SESSION['a'] already exists as an array of strings.
global $b;
$b = &$_SESSION['a'];
do_something();
function do_something() {
  global $b;
  // Do something with $b.
  // Problem: $b is always NULL when it should be an array.
}

问题是app.php中的$b = &$_SESSION['a'];行似乎无法正常工作,因此$GLOBALS['b']保持为NULL,这意味着$bdo_something()中也是NULL。

这似乎是因为app.php包含在module.php中的一个函数中,所以我认为这与app.php的范围和引用赋值有关。

不幸的是,我根本无法修改app.php,也无法将include()移动到module.php中的load_app()函数之外,所以有没有其他方法可以更改module.php以使app.php按预期工作?

在不同的地方插入global $b;以传播全局变量,经过多次尝试和错误,最终对我有效的是:

module.php:

function load_app() {
  $GLOBALS['b'] = &$_SESSION['a'];
  include('./app.php');
}

似乎在module.php中直接将引用分配给$GLOBALS['b']可以让app.php在没有任何修改的情况下正常工作。将引用指定给global $b不会。