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

Posted

技术标签:

【中文标题】Codeigniter:从视图中调用视图时的变量范围。奇怪的【英文标题】:Codeigniter : variables scope when calling a view from within a view. Odd 【发布时间】:2011-05-01 02:13:56 【问题描述】:

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

    如果变量最初是从控制器传递的,则无需将变量从视图传递到视图。 如果变量在视图中声明,我必须将变量从视图显式传递到视图。 (例如:$this->load->view("hoge", $data);)

我觉得第二种情况有点奇怪,因为我的理解是 $this->load->view() 是 php include() 的 codeigniter 版本,它不需要我显式传递变量。

谁能猜出/解释他们为什么这样做?

【问题讨论】:

【参考方案1】:

如果您查看最新版本的第 639 行附近的 Loader 库的 _ci_load 方法(view() 调用),您会看到以下代码:

/*
 * 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 个子视图,传递给第一个子视图的变量将被缓存并自动传递给第二个视图。有时会导致调试麻烦。

【讨论】:

CI 太糟糕了。它打破了分层编程的规则。我对我的变量冲突发疯了。最好使用 CI 的 HMVC MX 扩展。

以上是关于Codeigniter:从视图中调用视图时的变量范围。奇怪的的主要内容,如果未能解决你的问题,请参考以下文章

将变量从视图传递到视图 codeigniter

如何从视图中调用 codeigniter 控制器功能

从 codeigniter 中的视图调用模型是不是不好?

CodeIgniter 将变量传递给视图

在codeigniter中没有从视图中调用控制器

在Codeigniter中将javascript变量从视图发送到控制器[重复]