目前的情况:

  • 目前的版本 我的视的框架,它使用的课程作为控制器。
  • 我有一些"怀旧"模块从我的 视框架,该框架采用简单平包括作为控制器。

多简化这意味着:

新的版本:

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

    function dosomethingFunction() {
        $this->intVar = 123;
        $this->view('myView');
    }
}
?>

旧版本:

<?PHP
$globalVar = 123;
// view "controllername" is automatically shown
?>

我现在要写的包装能够使用我的老控制在我的新视,而无需改写了一切。要做到这一点,我有一个"包装"控制器:

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

(再次:这是非常、非常简化的-只是为了获得这个想法。不实际代码。)

这种做法的问题是,这以前全球变$globalVar现在仅存在内部法"dosomethingFunction"和不可访问由图。

这不会是这种情况如果我能力的需要表现为"在全球范围",以便$globalVar会再次被提供在全球范围。

所以:是否有某种方式来实现"require_global"或者类似的东西吗?

(一种解决我的问题就是修改我的老控制器上启动一堆"全球"的命令,但我会喜欢一个解决方案,我没有必要改变这么多,老码。)

(注:请不要告诉我GLOBALS是坏的。它完全忽略了一点这个问题。只是接受,这是一个需要保留一些旧编码的工作在一个更新、更清洁的环境。)

有帮助吗?

解决方案

你可以增加地方的变量定义内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');
    }
}

注意,这个工作不如预期,你应该打电话给之前需要使用任何其他东西的功能。get_defined_vars()返回唯一的变量,从目前的范围,所以没有array_diff黑客是必要的。

其他提示

这是最简单的解决方案我可以想到的。

使用get_defined_vars()function两次,并得到一个差异的每个呼吁,以确定哪些变量,推出了所需的文件。

例如:

$__defined_vars       = get_defined_vars();
require('old_dosomething.function.php');
$__newly_defined_vars = array_diff_assoc($__defined_vars, get_defined_vars());
$GLOBALS = array_merge($GLOBALS, $__newly_defined_vars);
$this->view('old_dosomething_view');

嗯,这是一个问题我以前从来没有看到。我想你可以这么做

class wrapController extends baseController {
    function dosomethingFunction() {
        require 'old_dosomething.function.php';

        // Force "old" globals into global scope
        $GLOBALS['globalVar'] = $globalVar;

        $this->view('old_dosomething_view');
    }
}

但是,这是一个非常繁琐,手工过程,以及,取决于有多少全局我们正在谈论的。我会考虑这一点,但我不知道的任何"自动魔术"解决掉我的头顶。

对任何人有兴趣:我的(至今)最终版本:

class wrapController extends baseController {
    function dosomethingFunction() {
        // ... do some initialisation stuff ...

        $__defined_vars = array_keys(get_defined_vars());

        require 'old_dosomething.function.php';

        $__newly_defined_vars = array_diff(
                                    array_keys(get_defined_vars()),
                                    $__defined_vars, 
                                    array('__defined_vars')
                                );
        foreach ($__newly_defined_vars as $var) {
            $GLOBALS[$var] = &$$var;
        }

        $this->view('old_dosomething_view');
    }
}

丑陋的,但它的工作。谢谢你的伟大的帮助!

你有没有尝试过之后从Zend框架?

该登记册是一个容器,用于储存的目的和价值的应用空间。通过储存的价值在注册表中,相同的对象总是提供整个应用程序。这种机制可以替代使用全球储存。

http://framework.zend.com/manual/en/zend.registry.html

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top