题
目前的情况:
- 我 目前的版本 我的视的框架,它使用的课程作为控制器。
- 我有一些"怀旧"模块从我的 旧 视框架,该框架采用简单平包括作为控制器。
多简化这意味着:
新的版本:
<?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框架?
该登记册是一个容器,用于储存的目的和价值的应用空间。通过储存的价值在注册表中,相同的对象总是提供整个应用程序。这种机制可以替代使用全球储存。