- 浏览: 153723 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
NickWar:
脚本很好用,感谢楼主分享
但我只能导出10篇文档的xml ...
原创使用google reader + PHP将iteye博客数据导入到wordpress中 -
再逢山水:
ninedoors 写道这位仁兄,还有一个问题,感觉挺诡异的, ...
ThinkPHP中M和D函数的区别 -
ninedoors:
这位仁兄,还有一个问题,感觉挺诡异的,却不知道原因。我在用th ...
ThinkPHP中M和D函数的区别 -
柏新星:
谢谢 最起码简单的了解了一些 呵呵
stdClass的介绍
1、index.php入口文件:
1) 指定 CodeIgniter 框架所在目录;
2) 定义 APPPATH 常量,指示应用程序文件根目录;
3) 载入 codeigniter/CodeIgniter.php 文件,启动框架。
2、codeigniter/CodeIgniter.php 文件:
主要完成初始化 CodeIgniter 框架和启动应用程序两项工作。
1) 实例化 CI_Benchmark,这个类用于标记应用程序执行消耗的时间;
2) 载入应用程序的配置文件 require(APPPATH.’config/config’.EXT);
3) 实例化 CI_Config,这个类用于将数组封装为可以操作的配置服务;
4) 实例化 CI_Router,这个类用于分析 URL 请求,确定要执行的控制器和动作;
5) 实例化 CI_Output,这个类提供输出内容的缓存和检查服务;
6) 通过 $OUT->_display_cache($CFG, $RTR) 尝试输出缓存内容,如果成功,则结束程序运行;
7) 判断控制器类定义文件是否存在。如果不存在则通过 show_404() 显示错误信息;
8) 实例化 CI_Input,这个类提供对 $_GET、$_POST 的访问手段,并封装了一些过滤方法;
9) 实例化 CI_URI,这个类提供对 URL 的分析、构造服务;
10) 实例化 CI_Language,这个类提供多语言字符串映射服务;
11) 载入 codeigniter/Base4.php 或者 codeigniter/Base5.php;
12) 载入 libraries/Controller.php;
13) 载入控制器类定义文件;
14) 实例化控制器类;
15) 如果控制器使用了 scaffolding 功能,则调用控制器的 _ci_scaffolding() 方法,否则调用控制器动作方法;
16) 通过 $OUT->_display(); 输出内容($OUT 是 CI_Output 的实例)。
详细:
CI_Benchmark
这个类很简单,就是用 microtime() 函数记录时间点,并提供 elapsed_time() 方法来计算两个时间点之间消耗的时间。这个类功能不多,但是很实用。CodeIgniter 中大部分类都是这种设计思想,值得称赞!
CI_Config
这个类其实是在内部维护了一个数组,用来记录应用程序的设置(类似 Windows 注册表)。这种简单的封装可以强制应用程序按照固定的规范访问设置,同时又不将设置保存为全局变量,避免无意中遭到破坏或篡改。
CI_Router
CI_Router 功能很单一。CI_Router 首先分析出应用程序当前使用的 URL 模式:PATHINFO 或普通模式。接下来从 URL 地址中分析出控制器名字、动作名以及参数名和参数值。分析的结果保存为 CI_Router 对象实例的成员变量。这里比较有特点的是,CI_Router 可以根据开发者在应用程序设置里面定义的模式来分析 URL,而不是使用某种固定的模式。
CI_Output
有两个主要功能:获得应用程序执行的所有输出内容和输出缓存服务。
应用程序执行的输出结果都会保存为 CI_Output 的成员变量。然后根据应用程序设置,CI_Output::_display() 方法会调用 CI_Output::_write_cache() 方法将输出内容缓存起来。下一次当使用 CI_Output::_display_cache() 时如果缓存已经建立了,并且没有过期,则会直接输出缓存内容。
在 CI_Output::_write_cache() 中,是根据 URL 地址和 URL 参数来确定缓存 ID 的。因此即便是同一个控制器和动作,只要使用不同的 URL 参数,也会缓存不同的内容。
这个类的功能很简单,因此在许多动态页面是无法使用的。例如用户登录前和登录后,访问同一个控制器和动作并使用相同的 URL 参数,页面内容也有可能是不同的。这时,CI_Output 的缓存就不能使用。因为从本质上来说,CI_Output 提供的缓存是在应用程序之外的,所以应用程序无法根据当前状态来决定是否缓存页面。当一个页面被缓存后,对该页面的访问实际上根本就不会执行应用程序代码,而是由 CI_Output 取出缓存内容直接就输出了。
CI_Input
CI_Input 是类似过滤器,并且提供了对 $_GET、$_POST 的封装服务。例如用 CI_Input::post() 方法来访问 $_POST。由于多了这层封装,CI_Input 可以在 post() 方法中对数据进行更多的过滤。
这种封装从出发点上看,是很不错的。但是这也会造成一些问题。例如 CI_Input 只有在调用 post() 方法时才能进行过滤。如果应用程序使用 $_POST 直接获取数据,那么实际上就绕过了安全屏障。如果应用程序使用了第三方库,那么这种风险更大,因为第三方库很可能会直接使用 $_POST 等全局变量。
因此有些开发者认为过滤应该是全局的,即在框架初始化时,就对所有输入数据进行过滤。但初始化时的全局过滤灵活性很差,要么全过滤,要么都不过滤,没法做到对个别数据的单独过滤。
CI_Input 的另一个问题,就是没有处理 magic_quotes。不管 magic_quotes 设置为什么,CI_Input 都没有对数据进行相关的处理。这样一来,如果服务器的 magic_quotes 设置不同,那么应用程序得到的数据也是不一致的。后来查看数据库驱动的代码,发现 CI_Input 将对 magic_quotes 的处理放到了数据库驱动中。
这种设计是有很大缺陷的!如果应用程序取得数据后,并不是存入数据库(例如直接显示或存入文件),那么就必须自行判断 magic_quotes 的状态。这种判断不但烦琐,而且容易遗忘。所以框架有责任将所有数据库整理为一致的格式,要么是应用 addslashes() 转义过后的数据,要么是没有转义的数据。
奇怪的是 CI_Input 却对输入数据的字段名进行了 magic_quotes 检查,并应用了 addslashes()。这是为了让数据库字段名不会成为 SQL 注入攻击的根源。甚至,CI_Input 还会将 \n\r\n\r 替换为 \n。这种随意篡改原始数据的做法,非常不可取。
总之,我个人认为 CodeIgniter 在这部分的设计是很糟糕的。不过要改善也很简单,几行代码就可以了。然后修改一下数据库驱动。但是由于已经有许多采用 CodeIgniter 开发的应用程序,所以这样的升级改动,影响是非常大的。
CI_URI
由于 CodeIgniter 允许应用程序定义 URL 映射模式,所以需要专门的工具来生成 URL 地址。CI_URI 就是完成这些工作的。
CI_Language
这个类可以载入不同的语言文件。然后应用程序就可以用 CI_Language::line() 方法取出某个项目的对应翻译。每个语言文件就是一个名值对数组。所以 CI_Language::line() 以项目名做为键名,就可以查询到对应的翻译。
1) 指定 CodeIgniter 框架所在目录;
2) 定义 APPPATH 常量,指示应用程序文件根目录;
3) 载入 codeigniter/CodeIgniter.php 文件,启动框架。
2、codeigniter/CodeIgniter.php 文件:
主要完成初始化 CodeIgniter 框架和启动应用程序两项工作。
1) 实例化 CI_Benchmark,这个类用于标记应用程序执行消耗的时间;
2) 载入应用程序的配置文件 require(APPPATH.’config/config’.EXT);
3) 实例化 CI_Config,这个类用于将数组封装为可以操作的配置服务;
4) 实例化 CI_Router,这个类用于分析 URL 请求,确定要执行的控制器和动作;
5) 实例化 CI_Output,这个类提供输出内容的缓存和检查服务;
6) 通过 $OUT->_display_cache($CFG, $RTR) 尝试输出缓存内容,如果成功,则结束程序运行;
7) 判断控制器类定义文件是否存在。如果不存在则通过 show_404() 显示错误信息;
8) 实例化 CI_Input,这个类提供对 $_GET、$_POST 的访问手段,并封装了一些过滤方法;
9) 实例化 CI_URI,这个类提供对 URL 的分析、构造服务;
10) 实例化 CI_Language,这个类提供多语言字符串映射服务;
11) 载入 codeigniter/Base4.php 或者 codeigniter/Base5.php;
12) 载入 libraries/Controller.php;
13) 载入控制器类定义文件;
14) 实例化控制器类;
15) 如果控制器使用了 scaffolding 功能,则调用控制器的 _ci_scaffolding() 方法,否则调用控制器动作方法;
16) 通过 $OUT->_display(); 输出内容($OUT 是 CI_Output 的实例)。
详细:
CI_Benchmark
这个类很简单,就是用 microtime() 函数记录时间点,并提供 elapsed_time() 方法来计算两个时间点之间消耗的时间。这个类功能不多,但是很实用。CodeIgniter 中大部分类都是这种设计思想,值得称赞!
CI_Config
这个类其实是在内部维护了一个数组,用来记录应用程序的设置(类似 Windows 注册表)。这种简单的封装可以强制应用程序按照固定的规范访问设置,同时又不将设置保存为全局变量,避免无意中遭到破坏或篡改。
CI_Router
CI_Router 功能很单一。CI_Router 首先分析出应用程序当前使用的 URL 模式:PATHINFO 或普通模式。接下来从 URL 地址中分析出控制器名字、动作名以及参数名和参数值。分析的结果保存为 CI_Router 对象实例的成员变量。这里比较有特点的是,CI_Router 可以根据开发者在应用程序设置里面定义的模式来分析 URL,而不是使用某种固定的模式。
CI_Output
有两个主要功能:获得应用程序执行的所有输出内容和输出缓存服务。
应用程序执行的输出结果都会保存为 CI_Output 的成员变量。然后根据应用程序设置,CI_Output::_display() 方法会调用 CI_Output::_write_cache() 方法将输出内容缓存起来。下一次当使用 CI_Output::_display_cache() 时如果缓存已经建立了,并且没有过期,则会直接输出缓存内容。
在 CI_Output::_write_cache() 中,是根据 URL 地址和 URL 参数来确定缓存 ID 的。因此即便是同一个控制器和动作,只要使用不同的 URL 参数,也会缓存不同的内容。
这个类的功能很简单,因此在许多动态页面是无法使用的。例如用户登录前和登录后,访问同一个控制器和动作并使用相同的 URL 参数,页面内容也有可能是不同的。这时,CI_Output 的缓存就不能使用。因为从本质上来说,CI_Output 提供的缓存是在应用程序之外的,所以应用程序无法根据当前状态来决定是否缓存页面。当一个页面被缓存后,对该页面的访问实际上根本就不会执行应用程序代码,而是由 CI_Output 取出缓存内容直接就输出了。
CI_Input
CI_Input 是类似过滤器,并且提供了对 $_GET、$_POST 的封装服务。例如用 CI_Input::post() 方法来访问 $_POST。由于多了这层封装,CI_Input 可以在 post() 方法中对数据进行更多的过滤。
这种封装从出发点上看,是很不错的。但是这也会造成一些问题。例如 CI_Input 只有在调用 post() 方法时才能进行过滤。如果应用程序使用 $_POST 直接获取数据,那么实际上就绕过了安全屏障。如果应用程序使用了第三方库,那么这种风险更大,因为第三方库很可能会直接使用 $_POST 等全局变量。
因此有些开发者认为过滤应该是全局的,即在框架初始化时,就对所有输入数据进行过滤。但初始化时的全局过滤灵活性很差,要么全过滤,要么都不过滤,没法做到对个别数据的单独过滤。
CI_Input 的另一个问题,就是没有处理 magic_quotes。不管 magic_quotes 设置为什么,CI_Input 都没有对数据进行相关的处理。这样一来,如果服务器的 magic_quotes 设置不同,那么应用程序得到的数据也是不一致的。后来查看数据库驱动的代码,发现 CI_Input 将对 magic_quotes 的处理放到了数据库驱动中。
这种设计是有很大缺陷的!如果应用程序取得数据后,并不是存入数据库(例如直接显示或存入文件),那么就必须自行判断 magic_quotes 的状态。这种判断不但烦琐,而且容易遗忘。所以框架有责任将所有数据库整理为一致的格式,要么是应用 addslashes() 转义过后的数据,要么是没有转义的数据。
奇怪的是 CI_Input 却对输入数据的字段名进行了 magic_quotes 检查,并应用了 addslashes()。这是为了让数据库字段名不会成为 SQL 注入攻击的根源。甚至,CI_Input 还会将 \n\r\n\r 替换为 \n。这种随意篡改原始数据的做法,非常不可取。
总之,我个人认为 CodeIgniter 在这部分的设计是很糟糕的。不过要改善也很简单,几行代码就可以了。然后修改一下数据库驱动。但是由于已经有许多采用 CodeIgniter 开发的应用程序,所以这样的升级改动,影响是非常大的。
CI_URI
由于 CodeIgniter 允许应用程序定义 URL 映射模式,所以需要专门的工具来生成 URL 地址。CI_URI 就是完成这些工作的。
CI_Language
这个类可以载入不同的语言文件。然后应用程序就可以用 CI_Language::line() 方法取出某个项目的对应翻译。每个语言文件就是一个名值对数组。所以 CI_Language::line() 以项目名做为键名,就可以查询到对应的翻译。
发表评论
-
PHP stream_context_create()作用和用法分析
2013-04-03 10:28 0创建并返回一个文本数据流并应用各种选项,可用于fopen(), ... -
PHP - Iterator接口的解释
2012-12-06 14:23 873Iterator的接口定义如下: Iterato ... -
php中exec,system及passthru等函数用法
2012-08-13 10:49 1034由于PHP基本是用于WEB程 ... -
HTTP协议状态码详解(HTTP Status Code)
2012-08-13 10:41 987使用php或者javascript都会 ... -
spl_autoload_register 函数详解
2012-06-19 11:45 6676spl_autoload_register (PHP 5 &g ... -
PHP 程序员学数据结构与算法之《栈》
2012-11-24 17:01 1209介绍 “要成高 ... -
MySQL字段类型
2012-03-13 12:21 873MySQL支持大量的列类型 ... -
20个数据库设计的最佳实践
2012-02-27 10:33 10491、使用定义明确的表或列名,并保持一致(例如,School、S ... -
PHP中curl_setopt的CURLOPT系列 选项(转)
2012-01-17 15:41 3429curl_setopt()函数将为一个CURL会话设置选项。 ... -
2011年最热门的开源PHP项目回顾
2012-01-01 12:07 1158本文来自于对活跃在SourceForge和GitHub上的项目 ... -
PHP开发者常犯的10个MySQL错误
2012-01-01 12:03 892数据库是WEB大多数应用 ... -
PHP XML操作类DOMDocument
2011-08-29 14:18 1330不得不自已写一个.XML ... -
二十五个顶级PHP模板引擎整理
2011-08-09 17:20 1030为了找到一个好的模板引擎,我在互联网上进行搜索,目前已经整理出 ... -
php接收二进制数据流转换成图片
2011-08-04 17:49 11437<?php /** * 图片类 * @au ... -
PHP性能优化贴士——产生高度优化代码
2011-07-19 09:43 957PHP是一种在服务器端执 ... -
PHP register_shutdown_function函数详解
2011-07-18 11:47 1405脚本时常死掉,而且并不总是那么好看. 我们可不想给用户 ... -
PHP程序员最常犯的11个MySQL错误
2011-06-30 15:58 699对于大多数web应用来说,数据库都是一个十分基础性的部 ... -
简述MVC思想与PHP如何实现MVC
2011-06-20 11:17 859我相信已经有很多这样 ... -
PHP中的生成XML文件的4种方法
2011-06-15 11:56 2468<?xml version="1.0&qu ... -
stdClass的介绍
2011-06-02 10:11 1078在PHP开发中,很多时候都会看到别人的代码里有 $use ...
相关推荐
这篇文章是有关 CodeIgniter 的(以下简称 CI),CI 是一个达成以上目标的框架。 如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI 是你最好的朋友。 CI 有很多优点:免费,轻...
什么是CodeIgniter CodeIgniter是一个应用程序开发框架-一个工具包-适用于使用PHP构建网站的人们。 它的目标是通过提供一组用于执行常见任务的库以及一个简单的界面和逻辑结构来访问这些库,从而使您比从头开始编写...
CodeIgniter 是一套给 PHP 网站开发者使用的应用程序开发框架和工具包。它提供一套丰富的标准库以及简单的接口和逻辑结构,其目的是使开发人员更快速地进行...虽然版本比较较,但框架基本功能能满足大多数用户需要。
什么是 CodeIgniter CodeIgniter 是一个应用程序开发框架——一个工具包——适用于使用 PHP 构建网站的人。 它的目标是通过为常用任务提供一组丰富的库,以及访问这些库的简单接口和逻辑结构,使您能够比从头开始...
基本 CodeIgniter 模板 - 版本 0.1.1 该组件包括以下组件: 1. 测试编辑器的集成要在页面上集成可视化编辑器,您需要执行以下操作: 从官网下载 ,解压到path/to/libs/文件夹同理,下载 ,放在同一个文件夹下因此,...
CodeIgniter是一个应用程序开发框架-一个工具包-适用于使用PHP构建网站的人们。 它的目标是通过提供一组用于执行常见任务的库以及一个简单的界面和逻辑结构来访问这些库,从而使您比从头开始编写代码时更快地开发...
什么是 CodeIgniter CodeIgniter 是一个应用程序开发框架——一个工具包——适用于使用 PHP 构建网站的人。 它的目标是通过为常用任务提供一组丰富的库,以及访问这些库的简单接口和逻辑结构,使您能够比从头开始...
CodeIgniter是一个应用程序开发框架-一个工具包-适用于使用PHP构建网站的人们。 它的目标是通过提供一组用于执行常见任务的库以及一个简单的界面和逻辑结构来访问这些库,从而使您比从头开始编写代码时更快地开发...
Codeigniterplus 是良好标准 Web 应用程序的脚手架,构建在 codeigniter 框架之上,并扩展了各种其他第三方前端/后端库/技术。 这将帮助开发人员快速入门,以更好地管理 Web 应用程序开发。 请参阅 查看的 技术...
该存储库是基于以下工具开发的: (v3.1.3)-PHP框架模块化结构 - 更高级的CRUD功能 -API模块的基本设置身份验证-Ben CodeIgniter身份验证库 (v3.3.7)-流行的前端框架 (v1.5.8)-构建CRUD表的功能丰富的库 (v...
什么是CodeIgniter CodeIgniter是一个应用程序开发框架-一个工具包-适用于使用PHP构建网站的人们。 它的目标是通过提供一组用于执行常见任务的库以及一个简单的界面和逻辑结构来访问这些库,从而使您比从头开始编写...
1. **基础知识**:面试官可能会询问关于PHP基本语法、数据类型、控制结构、函数和数组的问题。 2. **面向对象编程(OOP)**:问题可能包括类和对象、继承、多态、封装和接口等OOP概念。 3. **超全局变量**:对`$_...
#Codeigniterplus Codeigniterplus正在构建一个良好的标准Web应用程序,它建立在codeigniter框架的顶部,并扩展了其他各种第三方前端/后端库/技术。 这将有助于开发人员快速入门,从而更好地管理Web应用程序。 请...
#Codeigniterplus Codeigniterplus正在构建一个良好的标准Web应用程序,它建立在codeigniter框架的顶部,并扩展了其他各种第三方前端/后端库/技术。 这将有助于开发人员快速入门,从而更好地管理Web应用程序。 请...
我曾计划将整个项目重构为CodeIgniter框架,但该计划目前处于搁置状态。 详细信息: : 官方Discord频道: : 请不要在游戏中与“ Lukas Rox”联系以获得支持,因为他不玩前夕 如果发现问题,请在此处访问Discord...
系统基于CodeIgniter框架,具有良好扩展性和管理性,可以帮助您在各种操作系统与运行环境中搭建各种网站模型而不需要对复杂繁琐的编程语言有太多的专业知识,为用户的修改提供方便,网站内容的每一个角落都可以在...
系统基于CodeIgniter框架,具有良好扩展性和管理性,可以帮助您在各种操作系统与运行环境中搭建各种网站模型而不需要对复杂繁琐的编程语言 有太多的专业知识,系统采用UTF-8编码,采取(语言-代码-程序)两两分离的...
系统基于CodeIgniter框架,具有良好扩展性和管理性,可以帮助您在各种操作系统与运行环境中搭建各种网站模型而不需要对复杂繁琐的编程语言 有太多的专业知识,系统采用UTF-8编码,采取(语言-代码-程序)两两分离的...