zoukankan      html  css  js  c++  java
  • CI框架源码研读(整体架构)

    有人说phper的深入要从研读mvc框架开始,我跳了一个常用的CI框架入手,主要是因为 CI框架简单轻巧,可以自己DIY功能!!!

    1、首先来看CI的整体架构图:

    其中:application是用户级开发目录,我们关心system系统源码目录,CI的核心代码都在这里了。

    1、core 系统核心代码

    2、database数据库相关的操作和帮助类

    3、helpers 系统提供的一些工具类

    4、language 语言包

    5、libraries 系统依赖类

    2、CI的代码流程

    我们初次访问CI的时候进入的welcome页面,那么这个welcome的页面请求都经过了哪些地方呢,我们来追踪一下。

    所以对ci的请求,都是首先进入index.php文件。在index.php文件中进行CI框架的初始化操作,

    define('ENVIRONMENT', isset($_SERVER['CI_ENV']) ? $_SERVER['CI_ENV'] : 'development');
    
    define('SELF', pathinfo(__FILE__, PATHINFO_BASENAME));
    
    define('BASEPATH', $system_path);
    
    define('FCPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
    
    define('SYSDIR', basename(BASEPATH));
    
    define('APPPATH', $application_folder.DIRECTORY_SEPARATOR);
    
    define('VIEWPATH', $view_folder.DIRECTORY_SEPARATOR);
    
    require_once BASEPATH.'core/CodeIgniter.php';

    在index.php文件中定义了必要的全局变量,最后引入了core/CodeIgniter.php核心类。那我们追踪到core/CodeIgniter.php中,文件中首先引入了:

    require_once(APPPATH.'config/constants.php');
    
    require_once(BASEPATH.'core/Common.php');

    之后又实例化了 Benchmark、Hooks、Config、Log、Utf8、URI、Router、Output、Security、Input、Lang 类,引入是调用common.php中的load_class方法实现的。

    $class = ucfirst($RTR->class);
    
    $method = $RTR->method;

    在路由中提取出对应要调用的class和method,然后实例化class且调用方法:

    $CI = new $class();
    
    call_user_func_array(array(&$CI, $method), $params);

    其前后调用了四个钩子:

    $EXT->call_hook('pre_controller');
    
    $EXT->call_hook('post_controller_constructor');
    
    $EXT->call_hook('post_controller');
    
    $EXT->call_hook('post_system');

    这里解析出的class和method,其实就是Welcome和index,之后我们 进入application/controllers/Welcome.php类后发现,类里只有

    public function index(){
    
       $this->load->view('welcome_message');
    
    }

    简单的 加载模板方法,我们看到Welcome 类继承自父类:CI_Controller

    我们进入CI_Controller类中查看:

    public function __construct(){
    
    self::$instance =& $this;
    
    foreach (is_loaded() as $var => $class){
    
    $this->$var =& load_class($class);
    
    }$this->load =& load_class('Loader', 'core');
    
    $this->load->initialize();
    
    log_message('info', 'Controller Class Initialized');
    
    }

    这段构造函数是将,在引导类CodeIgniter.php被实例化化的类赋值到本地类变量中,以构造一个超级对象被使用。同时实现了一个单例 公外部调用。

    那是如何赋值的那,这里调用了 common类 中的is_loader()方法。其实就是返回的我们在上面

    调用load_class()加载过的类:

    最后初始化成功后,会执行CodeIgniter.php文件中的:

    call_user_func_array(array(&$CI, $method), $params);

    这个函数,从而进入我们welcome控制器的index方法。

    大致的流程就是如此,可以根据自己的想法去实现功能,开发有意思的功能模块!!!!

  • 相关阅读:
    单例设计模式
    C#做窗体皮肤
    常用的数组的操作
    C#调试方法
    Timer
    程序对对象的字段的代码简写
    nginx upstream的几种配置方式
    ava如何实现系统监控、系统信息收集、sigar开源API的学习(转)
    vsftpd 被动模式与主动模式
    MySQL安装详解(V5.5 For Windows)
  • 原文地址:https://www.cnblogs.com/aksir/p/6781172.html
Copyright © 2011-2022 走看看