Php 加载视图时CodeIgniter出现意外行为

Php 加载视图时CodeIgniter出现意外行为,php,codeigniter,bug-tracking,Php,Codeigniter,Bug Tracking,我有一个查看器助手函数,它可以在页脚/页眉旁边加载主要内容。当我加载与主内容视图中的变量同名的标头的数组键时,发生了错误/意外行为-为标头和主内容加载了相同的数组 我认为这是正常的,因为相同的$data数组也被发送到标题和主要内容(如前所述)。因此,变量自然会出现在两个视图中。但事实并非如此。在将数据发送到标题后,我取消设置了$data变量,然后在我想将一些数据发送到主视图时重新创建了它,但问题仍然没有得到解决 我为这个bug/意外行为做了一个简单的例子: 考虑这个名为test的视图: <

我有一个查看器助手函数,它可以在页脚/页眉旁边加载主要内容。当我加载与主内容视图中的变量同名的标头的数组键时,发生了错误/意外行为-为标头和主内容加载了相同的数组

我认为这是正常的,因为相同的
$data
数组也被发送到标题和主要内容(如前所述)。因此,变量自然会出现在两个视图中。但事实并非如此。在将数据发送到标题后,我取消设置了
$data
变量,然后在我想将一些数据发送到主视图时重新创建了它,但问题仍然没有得到解决

我为这个bug/意外行为做了一个简单的例子:

考虑这个名为
test
的视图:

<?php 
echo $some_data;  
注意:整个代码将输出
一些数据。
三次。

解决此问题的唯一方法是发送一个不同的数组,并将数组键(即
some_data
)设置为其他将覆盖旧数组的键


那么,这是一个bug还是由CodeIgniter的伙计们制造的?

这是CodeIgniter的问题。您发送的变量似乎被缓存,直到您覆盖它们。我自己也遇到过这种情况,可以验证它


$this->load->view('test',array('some_data'=>NULL))

这是预期的行为

一旦设置了变量,它们就可以在控制器类及其视图文件中使用。在调用视图文件之前,在
$this->load->view()
中发送数组与直接将数组发送到
$this->load->vars()
相同。对于大多数在控制器中使用多个视图的人来说,这简化了工作。如果在一个控制器中使用多个视图文件,并且希望每个视图文件都有自己的专用变量集,则需要在视图调用之间手动清除
$this->load->\u ci\u cached\u vars
数组

Loader类中的代码注释描述了另一种情况,说明了为什么这是期望的默认行为:

//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文件:codeigniter\system\core\Loader.php

查找代码:(我想行号是806):

$this->\u ci\u cached\u vars=array\u merge($this->\u ci\u cached\u vars,$\u ci\u vars)

并将其更正为:

$this->\u ci\u cached\u vars=$\u ci\u vars


致以最诚挚的问候

此解决方案适用于简单情况(如示例),但我已传递了动态变量,因此手动取消设置它们对我来说是无效的。或者$This->load->vars('some_data',NULL);必须这样做,因为$this->\u ci\u cached\u vars受到保护。不过,更好的解决方案是创建我的_加载器并扩展该方法。
//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.