【问题标题】:Global variable assigned by reference inside a file included in a function在函数中包含的文件中通过引用分配的全局变量
【发布时间】:2015-07-03 15:05:42
【问题描述】:

以下是某个第 3 方模块如何将第 3 方应用程序添加到页面中的简化示例。该应用程序通常是独立的并可以直接访问,但该模块使用一个函数将应用程序包含在特定的 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 按预期工作?

【问题讨论】:

  • 您正在引用 PHP _SESSION 但我没有看到任何 session_start()...
  • @marekful 运行 module.php 的框架会创建一个会话,如果直接访问 app.php 也会创建一个会话,但我尽量简化示例。我们可以假设 $_SESSION['a'] 总是作为数组存在,所以我省略了所有会话代码。

标签: php reference scope php-include


【解决方案1】:

为了传播全局变量,在各个地方插入 global $b; 进行多次试验和错误后,最终对我有用的是:

module.php:

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

似乎直接将引用分配给module.php 中的$GLOBALS['b'] 可以让app.php 无需任何修改即可正常工作。分配对global $b 的引用不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    • 2011-09-01
    • 2017-02-04
    • 2012-05-21
    相关资源
    最近更新 更多