我心中的一个问题就是取笑我这是如何在内部发挥作用的。
我有一个像 TestController 这样的控制器,我已经将关联数组传递给名为 TestView 的视图。关联数组就像。
$options = array(
'small' => 'Samsung',
'med' => 'Apple',
'large' => 'HTC',
'xlarge' => 'Nokia');
我正在使用上面的数组加载视图。
$this->load->view('TestView', $options);
在视图中我可以将这些关联数组索引作为vairables访问。喜欢
echo $small;
echo $med;
echo $large;
echo $xlarge;
我很困惑这是如何工作的。
答案 0 :(得分:1)
如果我理解你的问题,你就会询问CodeIgniter如何实现这个功能。
看一下php函数extract,CodeIgniter使用它来使数组索引在视图上下文中作为变量可用。
你可以在第949行看到codeIgniter Loader类(system / core / Loader.php)
extract($this->_ci_cached_vars);
答案 1 :(得分:0)
数据通过视图加载函数的第二个参数中的数组或对象从控制器传递到视图。以下是使用数组的示例:
<?php
class Blog extends CI_Controller {
function index() {
$data['todo_list'] = array('Clean House', 'Call Mom', 'Run Errands');
$data['title'] = "My Real Title";
$data['heading'] = "My Real Heading";
$this->load->view('blogview', $data);
}
}
上面的示例$ data associative array将每个键转换为视图页面中的变量.it已由php extract函数完成其codeigniter流程。
查看页面:
<?php
print_r($todo_list);
echo $title;
echo $heading;
?>
答案 2 :(得分:0)
那是因为在system / core / Loader.php中的所有“loader方法”中都调用了_ci_load,里面使用以下代码从数组中提取变量并缓存它们:
/*
* 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))
{
foreach (array_keys($_ci_vars) as $key)
{
if (strncmp($key, '_ci_', 4) === 0)
{
unset($_ci_vars[$key]);
}
}
$this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
}
extract($this->_ci_cached_vars);
重点是摘录($ this-&gt; _ci_cached_vars);.这是一个标准的php函数,它将数组的所有元素导入到当前进程范围的符号表中;所以它为每个数组元素创建一个新变量。