- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
现状:
更简单的意思是:
新版本:
<?PHP
class blaController extends baseController {
private $intVar;
function dosomethingFunction() {
$this->intVar = 123;
$this->view('myView');
}
}
?>
旧版本:
<?PHP
$globalVar = 123;
// view "controllername" is automatically shown
?>
我现在正在尝试编写一个包装器,以便能够在我的新 MVC 中使用我的旧 Controller ,而无需重写所有内容。为此,我有一个“包装器” Controller :
class wrapController extends baseController {
function dosomethingFunction() {
require 'old_dosomething.function.php';
$this->view('old_dosomething_view');
}
}
(再一次强调:这是非常、非常简单的——只是为了理解这个想法。不是实际的代码。)
这种方法的问题是,以前的全局变量 $globalVar 现在只存在于方法“dosomethingFunction”中,不能被 View 访问。
如果我可以强制 require 表现得像“在全局范围内”,那么 $globalVar 将再次在全局范围内可用,情况就不会是这样了。
那么:有什么方法可以实现“require_global”或类似的东西吗?
(我的问题的一个解决方案是修改我的旧 Controller 以从一堆“全局”命令开始,但我更喜欢一个我不必更改太多旧代码的解决方案。)
(注意:请不要告诉我 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');
}
}
请注意,要使其按预期工作,您应该在函数中使用任何其他内容之前调用 require。 get_defined_vars() 仅返回当前范围内的变量,因此不需要 array_diff hack。
关于php - 如何实现 "require_global"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/751976/
现状: 我有我的 MVC 框架的当前版本,它使用类作为 Controller 。 我有一些来 self 的旧 MVC 框架的“老式”模块,它们使用简单、扁平的包含作为 Controller 。 更简单
我是一名优秀的程序员,十分优秀!