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方法。

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

  • 相关阅读:
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之六 多点触控
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之九 定位
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之七 重力感应
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之五 保存数据的几种方式
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之八 照相机
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之三 Application 配置详解
    Adobe Flash Builder 4.5 Android Air 程序开发系列 之四 打开与关闭应用程序是的保存数据
    ADOBE FLASH BUILDER 4.6 IOS 开发之部署与调试
    [译] 高性能JavaScript 1至5章总结
    页签及盒子的web标准实现
  • 原文地址:https://www.cnblogs.com/aksir/p/6781172.html
Copyright © 2011-2022 走看看