4

如果我有一个a.php 无法编辑的文件。

<?php
$a = 1;
function a() {
  global $a;
  echo $a;
}  
a();

然后运行php a.php打印1很好。但如果我有b.php

<?php
function b() {
  include "a.php";
}
b();

然后运行php b.php不会打印任何内容。

我可以在 之前键入什么include "a.php"以使其行为相同而无需编辑a.php

(显然除了定义之外$a。在我的真实示例中,它必须适用于复杂的a.php)。

4

3 回答 3

3

尝试将全局添加到您的新函数中:

function b() {
  global $a;

  include "a.php";
}

目前我想知道 PHP 是否被$a视为您的函数的本地b()函数。

附录:作为对您的评论的回应,您似乎需要获取包含在您的函数中本地创建的任意变量,并将它们重新制作为全局变量。这适用于 OSX 10.6.8 上的 5.3.20:

function b() {
    include 'a.php';

    // Move variables into global space
    foreach (get_defined_vars() as $name => $value) {
        global $$name;
        // global wipes the value, so just reset it
        $$name = $value;
        echo "Declared $name as global\n";
    }
}

b();
// Your global vars should be available here

echo显然,一旦您对它感到满意,您就可以删除它。

于 2013-02-03T11:05:39.700 回答
2

在函数内部定义函数?呸。但我想你有一个不允许任何其他方式的现实情况。但为了记录,这是非常糟糕的做法

添加global $ab()应该工作。

function b() {
  global $a;
  include "a.php";
}

我不知道需要定义哪些变量。a.php 真的很复杂

那么我能想到的唯一方法是不使用b.php中的函数,因此在包含a.php时您处于全局范围内。我看不出别的办法。

于 2013-02-03T11:05:31.120 回答
1

听起来a.php您必须将一些遗留或第 3 方脚本包装在自己的应用程序中。我曾经遇到过类似的问题,但解决方案并不漂亮。首先,您必须找出存在哪些全局变量(grep global或类似的帮助)。

这是我的“脚本适配器”类的相关部分:

private function _includeScript($file, $globals)
{
    foreach ($globals as $global) {
        global $$global;
    }

    ob_start();
    require $file;
    $this->_response->setBody(ob_get_clean());
}

如您所见,我也必须捕获输出。该类还模拟$_GET和捕获header将所有内容分配给Response对象的调用,但对于您的情况,只有此方法很重要。它以文件名和全局变量名数组作为参数调用:

_includeScript('a.php', array('a'));
于 2013-02-03T11:24:13.193 回答