威尼斯手机平台登陆-官方网站登录

威尼斯手机平台登陆为您带来世界三大博彩公司最新相关资讯,威尼斯官方网站登录充分考虑到不同地域网民的不同需求,威尼斯手机平台登陆良好的用户界面,人性化的操作,实用的功能设计使其广泛受到欢迎,推动实体出版、影视、动漫、游戏等相关文化产业的发展。

您的位置:威尼斯手机平台登陆 > 前端资源 > 付费投稿安排,近年来绸缪接任改正三个他人用Codeigniter写的档案的次序

付费投稿安排,近年来绸缪接任改正三个他人用Codeigniter写的档案的次序

发布时间:2020-03-12 13:42编辑:前端资源浏览(118)

    本文由码农网 – 邱康原创,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划!

    最近准备接手改进一个别人用Codeigniter写的项目,虽然之前也有用过CI,但是是完全按着自己的意思写的,没按CI的一些套路。用在公众的项目,最好还是按框架规范来,所以还是总结一下,免得以后别人再接手的时候贻笑大方。

    本文实例讲述了CodeIgniter自定义控制器MY_Controller用法。分享给大家供大家参考,具体如下:

    最近再给一个APP写API,同时还要写相应的后台管理网站。为了便于开发和代码组织与管理,我决定采用一个现有的框架。Codeigniter由于其轻量容易自定制的特点吸引了我,一路开发过来也有大半年时间了,写下一些自己在开发过程中的一些体会来与大家共勉。

    1. 首先是 MVC

    Codeigniter所有的控制器都必须继承CI_Controller类,但CI_Controller类位于system目录下,不太方便修改。为方便做一些公用的处理,通常情况下我们会在core下创建MY_Controller,用来继承CI_Controller,从而项目中所有的控制器继承MY_Controller。

    开发工具

    开发工具有好多,每个人的习惯也不同。Eclipse一直是我的最爱,那么怎么让Eclipse支持codeigniter呢?

    首先这是个PHP项目,所以得让Eclipse支持PHP。假设你的计算机已经安装了PHP,那么最简单的做法就是在Eclipse的market space中搜索PDT并安装。具体操作:Help -> Eclipse Marketplace。在输入框中输入PDT,点击find,如图:

    威尼斯登录首页 1

    点击右下方的install,等待几分钟即可。

    现在可以在Eclipse中写PHP了,不过对于codeigniter来说,经常用到的语句类似如下:

    $this->load->model ( 'user_model' );
    
    $this->input->post ('phone');
    

    每次都要手动输入这么长的类似的语句对于追求高效的人来说显然是不可取的,所以得让Eclipse支持codeigniter特定的代码提示,包括Controller和Model。把如下代码添加到

    system/core/ 目录下的Controller文件中CI_Controller类的构造函数之前,这其实就是进行

    变量声明,Model文件也是同样操作。

     /**
           * @var CI_Config
           */
    
           var $config;
    
           /**
           * @var CI_DB_active_record
           */
    
           var $db;
    
           /**
           * @var CI_Email
           */
    
           var $email;
    
           /**
           * @var CI_Form_validation
           */
    
           var $form_validation;
    
           /**
           * @var CI_Input
           */
    
           var $input;
    
           /**
           * @var CI_Loader
           */
    
           var $load;
    
           /**
           * @var CI_Router
           */
    
           var $router;
    
           /**
           * @var CI_Session
           */
    
           var $session;
    
           /**
           * @var CI_Table
           */
    
           var $table;
    
           /**
           * @var CI_Unit_test
           */
    
           var $unit;
    
           /**
           * @var CI_URI
           */
    
           var $uri;
    
           /**
           * @var CI_Pagination
           */
    
           var $pagination;
    

    现在效果如下:

    威尼斯登录首页 2

    只需输入$this 即可产生代码提示,效率提高不少。

    如果你还不知道 MVC ,应该尽快的学习,你会很快的体会到在 Model 中数据访问,在 Controller 中进行业务逻辑,在 Views 中编写 HTML 代码的价值。如果你之前没有使用过这种模式写过程序,你也许会皱起额头,不过你应该给自己尝试这样做的机会。

    那么,MY_Controller 通常会做些什么呢?

    自定义辅助函数和库

    一般一个项目中会有许多相同的逻辑,会使用到相同的代码。如果每次都去复制粘贴不仅麻烦而且不利于后续修改,想到需要修改一个逻辑就要到每个文件里修改代码就觉得可怕(涉及到设计模式这一块了,值得我们学学)。所以你要善于利用那些自定义辅助函数(helpers)和自定义的库(libraries)。把相同的逻辑封装成函数或者类,每次遇到相同的逻辑之时只需调用现成的helper或者library即可,修改也只需要在helper或者library中一处修改,不需要到处找代码。

    举一个我项目中的例子。API需要给APP发送的请求返回json格式数据,那么在PHP中的一种实现方法就是:

    echo json_encode ( $data);//$data 是array类型的数据
    

    但是如果$data中包含中文字符的话,输出的json数据会把中文变成Unicode编码,为了避免客户端需要再次处理数据,需要加入一个参数,即:

    echo json_encode ( $data , JSON_UNESCAPED_UNICODE);//$data 是array类型的数据
    

    这样就能输出原始的中文了。但是问题又来了,每次都要写这么长一段代码实在是麻烦,所以封装成一个辅助函数。在application/helpers 文件夹中新建一个文件render_helper.php。其中代码如下:

    <?php
    
    defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );
    
    /**
    
     * 打印不转义中文的json
    
     * @param [array] $data
    
     */
    
    function echo_json($data) {
    
           echo json_encode ( $data, JSON_UNESCAPED_UNICODE );
    
    }
    

    那么每次调用之时只需先在类中的构造函数载入该辅助函数,如下:

    $this->load->helper ( 'render' ); // 载入打印json的自定义辅助函数
    

    就可以在本类的所有成员函数中使用该方法:

    echo_json ( $data);
    

    这样省时省力(加上Eclipse的代码提示,你只需要输入echo,这个函数就可以出来了)。以后需要修改成编码后中文,或者转换成英文等等(奇怪的需求~)你都可以只修改一行代码,效率提高不少。

    一条实践准则是把更少的东西放进 Controller ,记住 DRY 准则:不要重复造轮子。当在超过一个地方编写相同的代码时,应该根据它的类型来尝试编写一个 library, helper,或 model。比如数据库连接类,用得很频繁,就把它做成 model(系统已提供)。

    所有的控制器都继承了MY_Controller, MY_Controller常常会加载一些公用帮助函数、公用类库,以及实现一些公用的方法。

    善用缓存

    如果一个APP的活跃用户不是很多,那么传统的LAMP架构就可以应付了。但是随着用户的逐渐增多,要想提高并发量,最好还是加一个缓存。在memcached和redis中,我选择了redis,主要因为它数据类型更丰富(不仅支持key-value型的数据,同时还提供list,set,zset,hash等数据结构的存储),能帮你实现一部分逻辑(避免重复造轮子)。与Eclipse配置同理,首先得让计算机上的PHP能够和redis通讯(假设你的计算机已经安装了redis),那么首选的是phpredis扩展,这里介绍一下我在Debain服务器上的配置过程,执行的命令如下:

    wget https://github.com/nicolasff/phpredis/archive/master.tar.gz  #下载扩展
    
    tar xvf master.tar.gz      #解压目录
    
    cd phpredis-master/     #进入解压后的目录
    
    phpize
    
    ./configure --enable-redis
    
    make && make install    #安装
    
    #但是报错-bash: phpize: command not found(在使用apt-get install php5安装php时,默
    
    #认是没有安装phpize的,我们安装phpredis时,需要用到phpize,因此,需要先安装#phpize。我们通过安装php开发者工具来获取phpize。执行如下命令即可: apt-get install #php5-dev)
    
    ls  /usr/lib/php5/20100525/#根据安装提示的文件,结果:curl.so  gd.so  redis.so
    
    vim /etc/php5/apache2/php.ini   #打开PHP配置文件
    
    # Dynamic Extensions 后面添加extension=redis.so,因为上面命令结果显示有redis.so
    
    /etc/init.d/apache2 restart       #重启Apache服务器
    

    现在PHP就能和redis通讯了,测试如下:

    <?php
    
     $redis = new Redis();
    
     $redis->connect('127.0.0.1',6379);
    
     $redis->auth('你的密码');//为了安全,要给redis设置密码
    
     $redis->set('tom','hanks');
    
     echo ' tom:'.$redis->get('tom'). '</br>';// tom:hanks
    
    echo 'will:'.$redis->get('will'); //will:
    
    ?>
    

    好了,现在来到配置codeigniter使其能够使用redis的步骤了。Codeigniter3.0.0本身具有redis支持,但是它实现的功能过于单一,不能够满足我的业务需求,所以必须要修改。但是最好不要直接在/system/libraries/Cache/drivers/Cache_redis.php 中修改,因为以后codeigniter升级采用直接覆盖system文件夹的形式,会覆盖掉你的代码。所以最明智的做法还是自己创建一个库,具体步骤如下:

    1、在application/config/redis.php 中加入配置信息:

    <?php
    
    defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );
    
    $config ['socket_type'] = 'tcp';
    
    config ['host'] = '你的服务器域名或者IP';
    
    $config ['password'] = '你的redis密码';
    
    $config ['port'] = 6379;
    
    $config ['timeout'] = 0;
    

    2、在application/libraries中建立如下图的文件结构

    威尼斯登录首页 3

    Rediscli.php 代码如下:

    <?php
    
    defined ( 'BASEPATH' ) or exit ( 'No direct script access allowed' );
    
    class Rediscli extends CI_Driver_Library {
    
           public $valid_drivers;
    
           public $CI;
    
           function __construct() {
    
                  $this->CI = & get_instance ();
    
                  $this->valid_drivers = array (
    
                                'default'
    
                  );
    
           }
    
    }
    

    Rediscli_default.php 代码从/system/libraries/Cache/drivers/Cache_redis.php 直接拷贝过来,唯一的不同是把类名从CI_Cache_redis改为Rediscli_default,这样就能按照官方的使用方法使用我们自己写的库。

    3、现在可以在Rediscli_default.php中添加或者修改方法,具体操作取决于你自己的应用的需求。比如在我的应用中,需要保持一个一定长度的队列,所以在Rediscli_default类中添加如下两个方法:

    /**
    
           * 弹出链表头元素
    
           * @param unknown $key,链表名              
    
           */
    
           public function lpop($key) {
    
                  return $this->_redis->lPop ( $key );
    
           }
    
           /**
    
           * 插入元素到表尾
    
           * @param unknown $key,链表名              
    
           * @param unknown $value,待插入值              
    
           */
    
           public function rpush($key, $value) {
    
                  return $this->_redis->rPush ( $key, $value );
    
           }
    

    某个类需要调用该库时只需在其构造函数中添加如下代码:

    $this->load->driver ( 'rediscli' ); // 加载redis自定义库
    
    $this->rediscli->default->is_supported ();//判断是否支持redis并打开连接
    

    则该类的每个函数就都可以使用Rediscli_default类中的任一方法,示例如下:

    $this->rediscli->default->lpop('delnews');//弹出名为delnews的链表头元素
    
    $this->rediscli->default->rpush('delnews',$nid);//该链表加入尾元素$nid
    

    一旦领悟了 MVC 的精髓,这将会成为一种习惯,你会从 MVC 简洁的代码中受益良多。

    公用的方法?公有的方法?

    登陆逻辑的实现

    对于我们的APP来说,每个请求都要判断用户是否已登陆,对于登陆的合法用户正常显示请求,对于未登录的用户提示“请先登录”。一般的web应用采用cookie-session机制,一般的session都是以文件形式保存在服务器上,考虑到文件访问慢于内存访问,我们可以配置codeigniter的session保存于redis中。我这里模仿这种机制:用户正常login后返回一个特定的id和特定的token(你可以自定义产生算法),服务器以id为key、token为value直接保存在redis中。以后的每次访问APP都必须带上用appsecret(预定义)加密后的参数id和token,服务器端校验成功即正常返回数据,否则提示“请先登录”。

    那么是否每个类都需要写一遍检查登陆的代码呢?当然不能这么干,我们可以自定义一个基类,在该基类的构造函数中检查登陆状态(还可以在这里加载常用的辅助函数和库,比如上面的render_helper 和 rediscli)。然后其他的业务逻辑的类就继承该基类,并完成其自身逻辑即可。

    具体操作就是在 application/core 中新建文件 MY_Controller.php,该文件对应MY_Controller类(继承CI_Controller类)。该类只需要一个构造函数完成上述功能即可。

    然后其它逻辑类只需继承MY_Controller类就不必再次校验登陆状态,而只需完成自身逻辑。

    一个原则就是:复杂的操作都交给Model。Controller更像个建筑师。 Model是苦工。 View 是粉刷工。Controller 只需要把东西丢进Model里就可以了,不需要在意数据是否异常,然后返回一个标志位以及相应的数据。这样MVC 的 架构就体现出来了。

    看到这些方法会意识到一个问题,如果方法是public的,那是否可以通过浏览器访问到。答案是可以的!这样不该让用户访问到的方法让用户访问到了。那设置protected吧。。。

    总结

    Codeigniter是我最喜欢的一个PHP框架(相比于thinkPHP,Zend Framework等等),主要在于其易安装,轻量,易自定制的优点。把握好这些优点,我们就能写出不逊于那些重量级框架写出来的应用,并且省时省力。

    作为一个学生,在摸索学习的路上还有很多问题需要解决,本文的目的在于和大家分享,更重要的是大家有什么建议或者批评请一定不吝赐教哈,我的微博:邱康singasong。

    Model其实就像一个电器如:微波炉一样,使用方法越简单越让人喜欢,(把食物放进去 -按启动 -ok,饭熟了。)接口少的好处是,Model升级代码优化的时候,对外界的耦合度不高。即使你内部写得很烂,接口也很干净,用起来也简单。

    备注:CI_Controller中写public方法不会被访问到,框架限制了CI_Controller中方法通过浏览器访问。

    2. Application 和 System 路径

    随着项目的不断进展,MY_Controller中的公用方法会越来越多。如果此时要增加后台管理的功能,所有的控制器依然继承MY_Controller,那其中的很多方法可能不适用了。如果后台需要的一些公用方法也写在这里,这里将会变得混乱。

    最好是把 system 和 application 文件夹放在 webroot 以外的地方,如果 index.php 放在 FTP 服务器的 /public_html/ 路径下,应该尝试把 System 放在根目录下 /system ,这样的话,只能通过 index.php 访问你的PHP文件。

    如何按模块区分不同的控制器?

    不要忘记在index.php文件中修改 $system_folder 和 $application_folder 的值,$system_folder 的值应该是相对于 index.php 文件,而 $application_folder 的值是相对于 system 目录。

    有两种处理的方式,第一种是通过不同的公用控制器文件来区分,由控制器去决定继承哪一个公用控制器,当然这里得引入公用文件。还有这种方式是可以通过对象的一个属性来维护,不同的模块赋予该属性不同的对象。如:

    3. 错误报告和调试

    load->library('api_helper', NULL, 'helper'); break; case 'admin' : $this->load->library('admin_helper', NULL, 'helper'); break; default : $this->load->library('app_helper', NULL, 'helper'); break } }}/* End of file MY_Controller.php *//* Location: ./application/core/MY_Controller.php */
    

    常常犯的一个错误是忘记关闭 PHP 错误和数据库错误报告,这样做是有风险的。在任何一个公开的站点,error_reporting 应该设置为0 ,最多只能设置为 E_ERROR,数据库设置 db_debug 应该设置为 false,基于其他安全考虑,设置不显示出错信息 ini_set('display_errors', 'Off');

    控制器调用MY_Controller构造函数并传入type值,根据不同的type值会加载不同的类库,然后给类定义一个统一的别名,方便处理。具体的library可以处理该模块公用的方法或load公用的资源,相当于该模块的一个公用类。当然处理方式也可以是直接通过路由中的目录名或者控制器名称来控制等等。

    在你编码和调试时,应该把 error_reporting 设置为 E_ALL ,并且在把应用程序发布前解决每一个注意和警告。

    这样避免了加载不同的文件,调用方法时只需要通过$this->helper对象调用。在仔细看看,可以发现不同模块的公用类是放在library中,放在library或helper中都可以使用get_intance获取控制器对象,但每次使用都需要获取实例,相对麻烦,如果是模型呢?感觉也不太好。其中的公用方法有一些会跟业务逻辑相关,放在library感觉不太合适。

    一种简易的方法是在 application/config/database.php 文件设置 db_debug 的值为一个常量 MP_DB_DEBUG,当网站在运行中,如下设置:

    业务逻辑好像并没有一个好的地方去实现,控制器的私有方法?模型?

    复制代码 代码如下:
    ini_set('display_errors', 'Off');
    error_reporting(0);
    define('MP_DB_DEBUG', false);

    先总结下上面的处理方法:

    在编码和调试中设置为:

    1、不同模块之间可以按需加载以及实现自定义的公用方法,各个模块之间互不影响。如果各模块之间的公用方法比较多,也可以再去继承一个公用的类。

    复制代码 代码如下:
    ini_set('display_errors', 'On');
    error_reporting(E_ALL);
    define('MP_DB_DEBUG', true);

    2、公用方法放在library中,调用CI实例不方便。

    4. 安全问题很重要

    3、如果不喜欢$this->herlper的调用方法,可以让控制器去继承不同的公用控制器,思路是一样的,只是可能需要手动引入文件。

    在接收任何数据到你的程序之前,不管是表单提交的 POST 数据、COOKIE 数据、URI 数据、XML-RPC 数据、还是 SERVER 数组中的数据,我们都推荐你实践下面的三个步骤:

    更多关于CodeIgniter相关内容感兴趣的读者可查看本站专题:《codeigniter入门教程》和《CI框架进阶教程》

    过滤不良数据.
    验证数据以确保符合正确的类型, 长度, 大小等. (有时这一步骤也可取代第一步骤)
    在提交数据到你的数据库之前将其转换.
    关于SQL注入,XSS,以及 CSRF ,你应该先了解它们,再决定是否采用方法来防止它们。可以参考CI手册上的安全指南 以及 输入和安全类。也许最重要的原则是在把数据提交到数据库或文件系统之前检查所有用户的输入。

    希望本文所述对大家基于CodeIgniter框架的PHP程序设计有所帮助。

    SQL注入。使用 CI 自带的 Active Record 可以解决这个问题。
    XSS (跨站脚本)。通过设置 $config['global_xss_filtering'] = TRUE; 开启自动过滤POST和COOKIE中的跨站脚本攻击,但需要消耗一些资源。也可以在每次处理POST和COOKIE的时候单独使用,把第二个参数设为TRUE,如 $this->input->post('some_data', TRUE); 表单验证类也提供了 XSS 过滤选项,如 $this->form_validation->set_rules('username', 'Username', 'trim|required|xss_clean');
    CSRF (跨站请求伪造)。CI 2.0 将内置 CSRF 检查,在 Google 上搜索 "CSRF tokens" 学习更多关于在保护表单提交和 URL 链接的知识,在 Ajax 应用方面可以搜索 "double cookie submission" 或 "双提交 cookie"。
    SPAM (垃圾留言和恶意注册)。通过保护你的邮件表单,评论表单,以及其他各种免费用户提交的数据来防止垃圾信息,一个简单的方法是只允许一个IP/User客户端在一分钟之内只能提交一次,一个比较好的方式是使用 Captcha ,CI2中内置了一个CAPTCHA的辅助函数。

    5. 数据库 和 ORM

    CodeIgniter 有一个自带的库 Active Record 能够帮助你在不使用 SQL 语句的情况下写查询语句。这在你不太精通 SQL 语句或不知道怎样防止SQL注入的情况下是一个很好的方法。

    当你需要更强大的工具时,你可以考虑使用 Object Relational Mapper ,就是鼎鼎大名的 ORM 了,遗憾的是,CodeIgniter 没有自带 ORM 库,不过也有一些其他很好的选择。

    最流行的或许是 DataMapper OverZealous Edition (DMZ),还可以使用 Doctrine (这里有一个教程),另一个选择 RapidDataMapper 是作者自己的作品。

    6. 代码实践

    编写简洁的代码,并且理解你的代码,不要只是复制粘贴别人的代码,并且不断提高编码能力。手册上的开发规范是一个能学习怎样更好编写代码的地方。

    1. DRY。不要总是重复造轮子,把能重用的代码放在它应该在的地方,比如libraries, helpers 或者是 models,而不是controllers,一个经验准则:当你复制代码的时候,也许你已经第二次把它放在了错误的地方。

    1. Caching (缓存)。缓存是一个提高性能的很好的方式,尤其是减少数据库的访问。可以参考网页缓存和数据库缓存,或者在论坛上搜索其他的可选方案,比如 MP_Cache 是作者自己的作品。

    2. HTTP headers (HTTP头部)。在客户端你能够通过单独发送HTTP头部使浏览器缓存页面来提高性能,当你使用 AJAX 的时候你也需要了解它来禁止浏览器缓存。

    一个禁止缓存的例子:

    复制代码 代码如下:
    $this->output->set_header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    $this->output->set_威尼斯登录首页,header("Cache-Control: no-store, no-cache, must-revalidate");
    $this->output->set_header("Cache-Control: post-check=0, pre-check=0", false);
    $this->output->set_header("Pragma: no-cache");

    一个长时间保持缓存的例子(比如 css, javascript):

    复制代码 代码如下:
    $this->output->set_header('Cache-Control: private, pre-check=0, post-check=0, max-age=2592000');
    $this->output->set_header('Expires: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() + 2592000));
    $this->output->set_header('Last-Modified: ' . gmstrftime("%a, %d %b %Y %H:%M:%S GMT", time() - 20));

    7. 模板渲染不必每次都调用 header 与 footer

    在 MY_Controller 头部和 __construct 函数中添加以下内容,用于设定默认的模版信息,其中 SITE_NAME 需要自己在 application/config/constants.php 里面自己定义:

    复制代码 代码如下:
    class MY_Controller extends CI_Controller {
      protected $_data;    // 模版传值数组
      protected $_tplext;  // 默认模版后缀
      protected $_header;  // 默认头部模版
      protected $_footer;  // 默认底部模版
      public function __construct () {
          parent::__construct();
          $this->_data['title'] = SITE_NAME;
          $this->_tplext = '.php';
          $this->_header = 'templates/header';
          $this->_footer = 'templates/footer';
          // 开发模式下开启性能分析
          if (ENVIRONMENT === 'development') {
              $this->output->enable_profiler(TRUE);
          }
      }
    }

    8. 不必所有的类都继承 CI_Controller

    新增的控制器不再继承 CI_Controller,而改继承 MY_Controller:

    复制代码 代码如下:
    class Index extends MY_Controller {
      public function __construct () {
          parent::__construct();
      }
      /**
       * 前台首页
       */
      public function index () {
          $this->_data['title'] = '首页';  // 不指定则使用默认标题 SITE_NAME
          $this->_view('index/index');
      }
    }

    末了,再补充两个:

    9. CodeIgniter的文件结构

    cache用以存储缓存文件,codeigniter文件夹包含了CI的基类CI_Base,为了兼容php4和php5,CI_Base有两个版本,其中php4版本的CI_Base继承于CI_Loader。libraries里存放了大部分常用的类库,最主要的三个类:Model,View和Cotronller,自己写的任何mvc都要继承于已有的mvc类;helpers里是一些函数(方法)集合,用以辅助其他模块的方便工作。language是一个语言包,用以支持多语言。

    application文件夹用以存储您的应用程序,CI已经在内部为您增加了一些子文件,包括models、views、controllers、config、errors、hooks和libraries。其中前三个文件夹是用以创建模型、视图和控制器的。您的大部分工作都应该是创建属于自己的MVC,并可在config里加入配置文件,libraries里加入一些对象和方法,用来辅助您的模型和控制器工作。而hooks也是对CI_Hooks的扩展,具体内容见下面的章节。

    10. CodeIgniter的工作过程

    当有一个http请求时,如http://www.google.com/blog/,首先进入CI的引导文件index.php。接下来我们看看index.php里做了哪些事情。

    index首先设置了应用程序的文件夹名称为application,系统的文件夹名称为system,然后做了一系列严格的判断并转换为unix风格的服务器绝对文件路径,具体说来定义了两个比较重要的常量,APPPATH,应用程序的文件夹路径,根据分析可知,该路径可以和system同级:htdocs/application/,也可以放到system文件夹里面,作为其子文件夹:htdocs/system/application/,但推荐采用第二种方式,这样显得比较整齐;BASEPATH,网站文档的基本文件路径,写出来大概是htdoc/system/;到最后,index引导文件引入了codeigniter/codeigniter.php里。接下来我们看看codeigniter里做了什么事情。

    codeigniter.php一上来就引入了三个文件:Common.php,Compat.php和config/constants.php,其中Common里包含了一些函数,用于载入类库的load_class,记录日志的log_message,和引入错误页面的show_404是几个重要的函数;Compat主要解决了php4和php5中的函数不兼容问题,而constants则定义了一些读写文件权限的常量。

    紧接着codeigniter载入了第一个类库,Benchmark,这个类库最简单的一个应用就是计算网页从开始到编译结束所花掉的时间,所以您在编译开始的地方打上一个标记,渲染结束后再打上一个标记,就可以算出其中花费的时间了。

    接着载入了第二个类库,Hooks,这个类库和Benchmark一样都是在systemlibraries下,这个类库的作用是在程序开始编译之前给您提供一个执行其他事情的机会,Hooks会您执行其他任务提供了大约8个机会,具体参见用户指南。在这里,它导入了第一个钩子。

    然后分别载入了Config,URI,Router,Output等类库,接着,检查是否有cache_override的钩子,这个钩子可以允许您调度自己的函数来替代Output类的_display_cache方法,如果没有,直接调用Output的_display_cache,检查是否有缓存内容,如果有,则直接输出缓存,退出;如果没有,则接着往下执行。

    此后,继续载入Input,Language,注意此前载入的类库都是一个引用;然后又一个重要的载入,那就是CI_Base对象的载入,首先会判断php的版本,如果是php4版本的,则会首先载入Loader,然后载入Base4,因为Base4中CI_Base继承于CI_Loader,而Base5中,CI_Base与CI_Loader没有继承关系。

    下一步,也是真正关键的一步了,这一步开始载入了一个Controller类,这个是个实例,而不是引用;然后通过Router来解析http地址,获得控制器和方法的名字,接着看applicationcontrollers里是否存在这样的控制器和方法,如果没有,则报错;如果有,则开始判断。

    小结

    先总结这么多,以后有再补充。希望大家能投喜欢。

    本文由威尼斯手机平台登陆发布于前端资源,转载请注明出处:付费投稿安排,近年来绸缪接任改正三个他人用Codeigniter写的档案的次序

    关键词: