从视图中调用视图时,我对变量范围感到困惑。 我测试了一下,发现:
我发现第二种情况有点奇怪,因为我的理解是$ this-> load-> view()是php include()的codeigniter版本,它不需要我明确地传递变量。
任何人都可以猜测/为什么会这样做?
答案 0 :(得分:4)
如果你看一下Loader库的_ci_load方法(view()调用),在最新版本的第639行附近,你会看到这段代码:
/*
* Extract and cache variables
*
* You can either set variables using the dedicated $this->load_vars()
* function or via the second parameter of this function. We'll merge
* the two types and cache them so that views that are embedded within
* other views can have access to these variables.
*/
if (is_array($_ci_vars))
{
$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
}
extract($this->_ci_cached_vars);
这就是传递给视图的变量在嵌套视图中自动可用的原因。
但是你的本地声明的变量不是..因为它们没有被传递给下一个view()调用。
请注意,它合并变量,所以从技术上讲,您可以将顶视图中更改的变量传递给子视图,其余变量将自动继承。
恕我直言,我认为为了清晰起见和其他潜在的人阅读你的代码,最好总是明确地传递你的子视图所需的所有变量。代码变得更容易阅读/调试。
注意:缓存的副作用是,如果您有2个子视图,传递给第一个子视图的变量将被缓存并自动传递到第二个视图..这可以有时导致调试麻烦。