【问题标题】:Codeigniter : variables scope when calling a view from within a view. OddCodeigniter:从视图中调用视图时的变量范围。奇怪的
【发布时间】:2023-03-16 13:01:01
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php 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 扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 2013-09-15
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 2013-10-24
    • 2018-02-21
    相关资源
    最近更新 更多