gpt4 book ai didi

php - 如何实现 "require_global"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:00:17 24 4
gpt4 key购买 nike

现状:

  • 我有我的 MVC 框架的当前版本,它使用类作为 Controller 。
  • 我有一些来 self 的 MVC 框架的“老式”模块,它们使用简单、扁平的包含作为 Controller 。

更简单的意思是:

新版本:

<?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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com