我有一个查看器助手函数,它加载页脚/页眉旁边的主要内容。当我为主内容视图中与变量同名的标头加载数组键时,出现了错误/意外行为-为标头和主内容加载了相同的数组。
我认为这很正常,因为相同的$data
数组也被发送到了标头和主要内容(如前所述)。因此,变量自然会出现在两个视图中。但是,事实并非如此。在将数据发送到标头后,我取消了$data
变量的设置,然后在想将一些数据发送到主视图时重新创建了它,但问题仍然没有解决。
我为这个错误/意外行为做了一个简单的例子:
考虑这个名为test
:的视图
<?php
echo $some_data;
这个控制器:
class Test extends CI_Controller {
function index() {
$data['some_data'] = 'Some data.';
$this->load->view('test', $data);
/*
* Output:
* Some data.
*/
unset($data);
unset($data['some_data']);//Just to make sure it's not PHP's fault.
$this->load->view('test');
/*
* Output:
* Some data.
*
* Even though the $data variable is unsetted AND not passed!
*/
$different_data = array();
$this->load->view('test', $different_data);
/*
* Output:
* Some Data.
*
* Still outputs the same thing, even though
* I'm sending different array(and the $data array is unstted).
*
*/
}
}
注意:整个代码将输出Some data.
三次
解决这个问题的唯一方法是发送一个不同的数组,并将数组键(即some_data
)设置为其他将覆盖旧数组的键。
那么,这是一个bug还是CodeIgniter的手下制造的?
我们遇到了和你一样的问题,我们的外星人同事找到了解决方案:
if file:codeigniter''system''core''Loader.php
查找代码:(我想行号是806):
$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
并将其更正为:
$this->_ci_cached_vars = $_ci_vars;
向致以最良好的问候
这是预期行为。
一旦设置了变量,它们就可以在控制器类及其视图文件中使用。在$this->load->view()
中发送数组与在调用视图文件之前直接向$this->load->vars()
发送数组相同。对于大多数在控制器中使用多个视图的人来说,这简化了操作。如果在一个控制器中使用多个视图文件,并且希望每个视图文件都有自己的变量集,则需要在视图调用之间手动清除$this->load->_ci_cached_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.
这是一个CodeIgniter问题。您要发送的变量似乎是缓存的,直到您覆盖它们。我自己也遇到过这种情况,可以验证。
$this->load->view('test', array('some_data' => NULL));