用户
 找回密码
 入住 CI 中国社区
搜索
查看: 4978|回复: 6
收起左侧

请教几个简单的问题

[复制链接]
发表于 2008-4-18 11:53:17 | 显示全部楼层 |阅读模式
第一个问题:
用 $this->load-> 这种方式调用函数很不错。我在查看源代码(\system\codeigniter\Base4.php)中发现是CI_Base类继承CI_Loader类,然后通过代码  $this->load =& $this; 完成的。

我要问的是在Base5.php中没有发现CI_Base类继承其他类,难道Php5已经可以自动完成这个功能了么? ( run under PHP 5.  It allows us to manage the CI super object more
  gracefully than what is possible with PHP 4.)

第二个问题:
这是用对象的形式传入视图:
$data = new Someclass();
$this->load->view('blogview', $data);

这是用数组的形式传入视图:
$data = array(
               'title' => 'My Title',
               'heading' => 'My Heading',
               'message' => 'My Message'
          );
$this->load->view('blogview', $data);

用对象和数组的形式,它们有什么区别?哪种方式比较好?

另外,我比较好奇,变量 $data
在视图中“找不到”了-----即无法调用$data ,难道是采用URL参数的方式?现在我们假设上面的data类和data数组的字段相同,那么数组和对象的视图文件应该分别怎么写?

像下面这样肯定不行
<ul>
<?php foreach($data as $item):?>
    <li><?php echo $item->title;?></li>
<?php endforeach;?>
</ul>

(刚接触php,请多指教。)
发表于 2008-4-18 12:01:12 | 显示全部楼层
第一个问题,请沧蓝来解答。
第二个问题,数组和对象没什么差别,可能有很少的性能差别,请查看:http://codeigniter.org.cn/forums/thread-419-1-1.html
还有,你传进去以后,$data 当然没有了,CI 会自动转换成 $title,$heading,$message。
发表于 2008-4-18 12:21:22 | 显示全部楼层
第二个问题,我记得CI是把$data数组使用一个php函数进行处理,功能是把里边每一个元素分别处理成变量
具体函数是extract(),具体请查看php手册
你在视图页面找不到$data的
发表于 2008-4-18 12:25:57 | 显示全部楼层
所以,你想要进行一个循环,必须在$data数组里放置一个数组,相当于二维数组吧
例如:
PHP复制代码
$data = array(
              'blog_title'   => 'My Blog Title',
              'blog_heading' => 'My Blog Heading',
              'blog_entries' => array(
                                      array('title' => 'Title 1', 'body' => 'Body 1'),
                                      array('title' => 'Title 2', 'body' => 'Body 2'),
                                      array('title' => 'Title 3', 'body' => 'Body 3'),
                                      array('title' => 'Title 4', 'body' => 'Body 4'),
                                      array('title' => 'Title 5', 'body' => 'Body 5')
                                      )
            );
复制代码


你在视图页面就可以这样
HTML复制代码
 
{blog_entries}
{title},{body}
{/blog_entries}
复制代码

具体参看手册的模板解析类
发表于 2008-4-18 14:45:37 | 显示全部楼层
关于第一个问题:可以从libraries/Controller.php的77行开始看。
 楼主| 发表于 2008-4-18 17:49:26 | 显示全部楼层
我一直以为View是可以传入对象的,原来只能是数组。这是view函数:

function view($view, $vars = array(), $return = FALSE)
{
        return $this->_ci_load(array('_ci_view' => $view, '_ci_vars' => $this->_ci_object_to_array($vars), '_ci_return' => $return));
}

是函数_object_to_array将对象转变数组的,没有用到函数extract()。

/**
* Object to Array
*
* Takes an object as input and converts the class variables to array key/vals
*
* @access        public
* @param        object
* @return        array
*/
function _object_to_array($object)
{
        if ( ! is_object($object))
        {
                return $object;
        }
       
        $array = array();
        foreach (get_object_vars($object) as $key => $val)
        {
                // There are some built in keys we need to ignore for this conversion
                if ( ! is_object($val) && ! is_array($val) && $key != '_parent_name' && $key != '_ci_scaffolding' && $key != '_ci_scaff_table')

                {
                        $array[$key] = $val;
                }
        }

        return $array;
}
发表于 2008-4-18 18:22:17 | 显示全部楼层
必须以数组传到视图里,但是传入的数组中可以包含对象元素。
不知道楼主明白不明白我的意思。

本版积分规则