Codeigniter:从视图中调用视图时的变量范围。奇

时间:2010-10-27 03:17:29

标签: php codeigniter

从视图中调用视图时,我对变量范围感到困惑。 我测试了一下,发现:

     
  1. 如果变量最初是从控制器传递的,则无需执行某些操作即可将变量从视图传递到视图。
  2.  
  3. 如果变量是在视图中声明的,我必须将变量从视图显式传递给视图。 (例如:$ this-> load-> view(“hoge”,$ data);)
  4. 我发现第二种情况有点奇怪,因为我的理解是$ this-> load-> view()是php include()的codeigniter版本,它不需要我明确地传递变量。

    任何人都可以猜测/为什么会这样做?

1 个答案:

答案 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个子视图,传递给第一个子视图的变量将被缓存并自动传递到第二个视图..这可以有时导致调试麻烦。