初学php框架,一时间难以理解框架复杂功能的实现机制,但是却十分感兴趣,因为只有理解大致发生了什么才有继续学下去的兴趣,否则一直就想背函数似的,根本掌握不了,今天给大家分享下我四处搜集、自己做实验得出的关于ci框架视图加载机制,即load->view的实现。刚开始想着随便找个博客就会得到答案,谁知找半天都找不到,于是就参考着类加载机制以及亲手实验的方法,弄清楚了。
我当时一直都在费力的弄明白这个load->view(viewName,param)做了什么,而且为什么在视图中调用load->view()传的数组数据时,直接用数组元素的键值就可以了,最开始还以为,框架又向视图发送了post请求,一直都这样理解,后来仔细一想不对:php页面怎么会主动向视图发post请求,后来就越来越迷了,打开搜索引擎搜索ci框架视图实现机制,始终都找不到合适的理解,出现最多的是关于load_class这个函数的定义的理解 以及一些十分浅显的load->view()的用法,也不说咋实现的,于是我自己就想着亲自找出来这个load_view(),找的过程收获不小,对于我这种初学者来说。下面说一下我找的过程以及对视图加载的理解。
进入index.php,从开头翻啊翻,定义一系列的常量之类的东西之后在该文件的最后:
require_once BASEPATH.'core/CodeIgniter.php';
包含了框架核心目录的codeigniter.php 下面跳到该文件。
到了这个codeigniter.php下面,代码挺多的,但是不放弃,这个文件的名字和框架的名字一样 ,可以说是相当重要的吧应该,粗略的看了下,又是一系列的定义与包含文件,一下子就蒙了,后来觉得可能要去找被包含的文件,于是从头开始,不放过任何一个 require_once();
第一个被包含的文件是 APPPATH.'config/constants.php' 这个知道一点结合四处刷的博客和亲眼看代码,这个又是一系列的常量定义:
继续走,紧挨着又有一个
这个可以去看看 这个里面市一些公共函数的定义,也可以将自己定义的全局函数放里面,这个函数库很重要,后面会讲到,先不看这个,当时因为觉得函数库而已 ,就是无数个工具,也没注意,继续往下走(忽略一切define):
看到了这个,这个很熟悉,相信大家看视频的时候都用过,把经常用的辅助函数直接写到config数组里面自动加载,不用每次都要调用load函数加载了, 下面继续往下走:
连着包含了四个,不过我当时就跳了,看了看名字就感觉跟要找的视图加载机制无关,看起来像是一些工具库(我是小白,并不知道是啥,以后再说)继续走
到这了,包含了控制器类的定义,于是这次就进去仔细研究了一下:
把所有的注释注解都去了,复制一下:
class CI_Controller {
private static $instance;
public function __construct()
{
self::$instance =& $this;
foreach (is_loaded() as $var => $class)
{
$this->$var =& load_class($class);
}
$this->load =& load_class('Loader', 'core'); //对 就是这里,load成员是load_class函数返回值的引用
$this->load->initialize();
log_message('info', 'Controller Class Initialized');
}
public static function &get_instance()
{
return self::$instance;
}
}
猛的一看,这么点代码,为啥功能那么强大!!!可能这就是面向对象吧(2333)于是就结合着各个大佬的博客读了读,这个控制器的定义重要的在于他的构造函数(好吧虽然一看就知道),构造函数定义了自身的load成员是load_class()函数返回值的引用,也就是说控制器load成员是loader类(实例化后的对象)的引用,知道这个就好了下面的褐色字体是对这个函数的解析,可以不看 ,知道功能就好了。
(这个load_class()函数就是我搜索视图机制的时候频繁出现在各个博主博客上面的东西,前面说common.php很重要,因为这个函数就是在common.php里面,代码还挺长,跟功能很搭配,这个函数就是负责加载参数中指明的类,大家可以去看看我作为小白看了半天已经蒙了(被高级代码秀到了),但还是看到了这个函数的最后几句,他把你传进去的类的名字给实例化了
这个就是load_class()函数最后几句,拽来拽去最后这几句还是可以理解的,把你传进去的类查找之后然后给new了一下(实例化),然后返回这个类 实例化之后 的对象,最后通过函数前面的&符号取得对象的引用,)
知道了这些,再看看load成员到底是啥,前面红字标明了load是loader类对象的引用!!我们去看看这个东西到底是啥,答案就在不远了!!
一个比较牛逼的东西了,当然是在核心文件夹里面了,下面打开它,嘿嘿,这个可以说是很长了,当然了,我们用啥函数用啥库用啥模型之类的东西全都是用的load.....当然是很重量级的定义了
这里include了一下,大家可以去上面看看,上面一系列对$ci_path的拼接,最后成了你的视图的路径(应该是的),最后include了一下,你的视图就被加载了,是以include方式加载的....而且之前也说了你传递的那个数组已经被extract了,可以直接用数组元素的键名作为变量名直接使用了 我觉得到此可以结束了 ,初学php框架,言语不妥,有错误之处请指正。