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:从视图中调用视图时的变量范围。奇怪的的主要内容,如果未能解决你的问题,请参考以下文章