Bla*_*laM 4 php scope global include
现在的情况:
大大简化意味着:
新版本:
<?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是坏的.它完全忽略了这个问题的要点.请接受这是一个要求让一些旧代码在更新,更清洁的环境中工作.)
您可以将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.
归档时间: |
|
查看次数: |
10560 次 |
最近记录: |