PHP:"全球"包括在内

Bla*_*laM 4 php scope global include

现在的情况:

  • 我有我的MVC框架的当前版本,它使用类作为控制器.
  • 我的 MVC框架中有一些"复古"模块,它使用简单,扁平的包含作为控制器.

大大简化意味着:

新版本:

<?PHP
class blaController extends baseController {
    private $intVar;

    function dosomethingFunction() {
        $this->intVar = 123;
        $this->view('myView');
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

旧版:

<?PHP
$globalVar = 123;
// view "controllername" is automatically shown
?>
Run Code Online (Sandbox Code Playgroud)

我现在正在尝试编写一个包装器,以便能够在我的新MVC中使用我的旧控制器而无需重写所有内容.为此,我有一个"包装"控制器:

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';
        $this->view('old_dosomething_view');
    }
}
Run Code Online (Sandbox Code Playgroud)

(再一次:这非常非常简单 - 只是为了得到这个想法.不是真正的代码.)

该方法的问题在于,先前的全局变量$ globalVar现在仅存在于方法"dosomethingFunction"内,并且视图无法访问.

如果我可以强制要求表现为"在全局范围内"以便$ globalVar再次在全局范围内可用,则情况并非如此.

那么:有没有办法实现" require_global "或类似的东西?

(我的问题的一个解决方案是修改我的旧控制器以从一堆"全局"命令开始,但我更喜欢一个解决方案,我不必更改那么多旧代码.)

(注意:请不要告诉我GLOBALS是坏的.它完全忽略了这个问题的要点.请接受这是一个要求让一些旧代码在更新,更清洁的环境中工作.)

var*_*tec 6

您可以将dosomethingFunction()中定义的局部变量添加到全局范围:

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';
        //begin added code  
        $vararr = get_defined_vars();
        foreach($vararr as $varName => $varValue) 
              $GLOBALS[$varName] = $varValue;            
        //end added code          
        $this->view('old_dosomething_view');
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,为了使其按预期工作,您应该在使用函数中的任何其他内容之前调用require.get_defined_vars()仅返回当前作用域中的变量,因此不需要array_diff hacks.