- 浏览: 156321 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
NickWar:
脚本很好用,感谢楼主分享
但我只能导出10篇文档的xml ...
原创使用google reader + PHP将iteye博客数据导入到wordpress中 -
再逢山水:
ninedoors 写道这位仁兄,还有一个问题,感觉挺诡异的, ...
ThinkPHP中M和D函数的区别 -
ninedoors:
这位仁兄,还有一个问题,感觉挺诡异的,却不知道原因。我在用th ...
ThinkPHP中M和D函数的区别 -
柏新星:
谢谢 最起码简单的了解了一些 呵呵
stdClass的介绍
codeigniter/Base
codeigniter/Base4.php 和 codeigniter/Base5.php 功能一样,只不过分别适用于 PHP4 和 PHP5 而已。其中定义了 CI_Base 类和一个非常重要的 get_instance() 函数。
get_instance() 函数返回一个 CI_Base 类在整个应用程序中的唯一实例。
这里有一个有趣的发现。Base4.php 和 Base5.php 中的 CI_Base 和 get_instance() 有这完全不同的实现。
在 Base4.php(对应 PHP4)中,CI_Base 直接继承自 CI_Loader。CI_Base 实例化时,将 自身的引用保存到了 CI_Base::$load 中。也就是说 CI_Base 实例的 $load 实际上指向自己。然后 $load 被复制到一个名为 $OBJ 的全局变量。
在 PHP4 版的 get_instance() 函数中,如果检查到 $CI(这是 CI_Base 的实例,也就是控制器的实例)存在,就返回 $CI,否则返回全局变量 $OBJ->load。但由于在 PHP4 中,$OBJ->load 实际上就是一个 CI_Base 的实例。所以。。。。所以。。。。。。还是返回了一个 CI_Base 的实例。真搞不懂作者为什么这样写,简直要让人发疯。
不管怎么样,应用程序其他地方调用 get_instance() 都会获得一个 CI_Base 的实例。
在 Base5.php(对应 PHP5)中,用一个 singleton 模式来解决了这个问题。因此 CI_Base 也不再需要从 CI_Loader 继承了。不过这也留下了隐患(CI_Loader 实例要什么时候获取呢?),所以在 CI_Base 的继承类 Controller 中,只好通过判断是否是运行 PHP5 来决定是不是要实例化一个 CI_Loader。
真的很无语啊,这种设计虽然可以用,但是很糟糕。在 PHP4 种,CI_Loader 的方法和成员变量暴露在了 CI_Base 中。如果应用程序不小心调用了这些方法或使用了这些成员变量。那么应用程序在 PHP5 中运行就会出错。
Controller
Controller 类是所有控制器的基础类。
Controller 实例化时会将 CI_Input、CI_Benchmark、CI_Config、CI_URI、CI_Output、CI_Language 的实例复制到 Controller 实例的成员变量中。然后根据应用程序设置,自动载入文件。
但是这里作者显然没有处理好,所以不得不用 `global $IN, $BM, $CFG, $URI, $LANG, $OUT;` 这样的全局变量来传递几个重要的对象实例。
Controller 本身并没提供 model、helper 的载入服务。这些都由 CI_Loader 来提供。但是,CI_Loader 的各种载入服务,却又用 get_instance() 获取控制器的实例,然后调用 Controller(控制器都是 Controller 的继承类哦)的 _ci_initialize()、_ci_init_database() 等方法来做初始化。
神啊!救救我吧!这种错综复杂的关系,真的要人命啊!
Controller 的 $ci_is_loaded 成员变量用于保存已经载入的对象实例。所以每次用 Controller::_ci_load_model() 载入模块后,都要将该模块登记到 $ci_is_loaded,以避免重复载入。
Controller 里面大部分是一些初始化各种服务的方法,例如初始化数据库、Model 的方法。还有就是用 _ci_scaffolding() 调用 CodeIgniter 的“脚手架”功能。
对 Controller 的设计,没什么好说的,一个字:烂!
CI_Loader
CI_Loader 提供各种载入服务,例如载入 Model、Helper、View 等。但是(我真的很痛恨“但是”这个词),CI_Loader 却需要 Controller 来完成初始化。那么又是谁来调用 CI_Loader 呢?答案是 Controller。
这种紧密的耦合,完全是没有必要的!
控制器开始执行
分析到这里,终于进入应用程序的代码了。应用程序控制器中,可以用 $this->load 来载入各种服务,然后就可以调用这些载入的服务了。
虽然 CodeIgniter 在 CI_Base、Controller 和 CI_Loader 上设计很糟糕,但开发者如果不在乎这些,那么开发过程还是很愉快的。
下面我们再来看看 CodeIgniter 主要服务的特点。
数据库访问
与大部分框架不同,CodeIgniter 的 Model 类没有提供数据库访问功能。所有数据库操作都是通过数据库驱动程序来进行的。
所有数据库驱动均继承自 CI_DB 类。等等,我怎么找不到 CI_DB 类的定义呢?因为 CI_DB 类是在 Controller 中用 `eval(‘class CI_DB extends CI_DB_driver { }’);` 这行代码来定义的。定义这样一个空壳,估计是作者为以后扩充数据库驱动留下的伏笔。
CodeIgniter 的数据库驱动,功能都很简单,和 AdoDB Lite 类似,但是缺乏 AdoDB Lite 那么多的扩展库。我个人认为反倒不如用 AdoDB Lite 来替换这部分。当然了,CodeIgniter 目前已经有不少数据库驱动了,所以替换成 AdoDB Lite 好处不多。
CodeIgniter 也提供了一个 ActiveRecord 实现,不过这个 ActiveRecord 可没有一点半点的“ORM”能力。但是 CodeIgniter 的 ActiveRecord 不需要为每一个数据表都构造一个实例。通常一个实例就可以处理多个数据表的操作。
例如 `$query = $this->db->get(‘mytable’);` 和 `$query = $this->db->get(‘mytable2′);` 就可以分别取得 mytable 和 mytable2 的数据。
说实话,作者可能用错了名字。
CodeIgniter 中的“ActiveRecord”实际上是表数据入口模式——TableDataGateway。
CodeIgniter 中的 ActiveRecord 基本上只是一个对数据表进行 CRUD 操作的公共接口。没有提供 RoR、CakePHP、FleaPHP 等框架具有的数据表关联自动处理能力。和自己写 SQL 相比,没什么优势。唯一的好处就是作者所说的可以让 ActiveRecord 来生成这些简单的 SQL 语句,而不用自己写,提高应用程序在不同数据库之间移植的能力。
“脚手架”功能
CodeIgniter 中提供了基本的“脚手架”功能,可以用几行代码即实现一个对某个数据表进行 CRUD 的界面。这和 phpMyAdmin 中的数据浏览、编辑页面类似,当然功能要简单得多。
“脚手架”有什么实用价值,众说纷纭。但普遍认同的一点就是“脚手架”功能为处于开发初期的应用程序提供了管理数据的界面。开发者可以在后期替换掉“脚手架”的界面。
但是,CodeIgniter 也太简单了,就只有 CRUD 操作,还不如 phpMyAdmin 好用。
其他
CodeIgniter 还有许多其他的类和助手。这些类基本上都属于提供各种辅助服务的范畴。有些类很不错,像图片操作。但大部分类和助手实在太简单,缺乏实用价值。像数据验证助手,只能做很基本的验证,在绝大多数应用程序里面都不能满足要求。
codeigniter/Base4.php 和 codeigniter/Base5.php 功能一样,只不过分别适用于 PHP4 和 PHP5 而已。其中定义了 CI_Base 类和一个非常重要的 get_instance() 函数。
get_instance() 函数返回一个 CI_Base 类在整个应用程序中的唯一实例。
这里有一个有趣的发现。Base4.php 和 Base5.php 中的 CI_Base 和 get_instance() 有这完全不同的实现。
在 Base4.php(对应 PHP4)中,CI_Base 直接继承自 CI_Loader。CI_Base 实例化时,将 自身的引用保存到了 CI_Base::$load 中。也就是说 CI_Base 实例的 $load 实际上指向自己。然后 $load 被复制到一个名为 $OBJ 的全局变量。
在 PHP4 版的 get_instance() 函数中,如果检查到 $CI(这是 CI_Base 的实例,也就是控制器的实例)存在,就返回 $CI,否则返回全局变量 $OBJ->load。但由于在 PHP4 中,$OBJ->load 实际上就是一个 CI_Base 的实例。所以。。。。所以。。。。。。还是返回了一个 CI_Base 的实例。真搞不懂作者为什么这样写,简直要让人发疯。
不管怎么样,应用程序其他地方调用 get_instance() 都会获得一个 CI_Base 的实例。
在 Base5.php(对应 PHP5)中,用一个 singleton 模式来解决了这个问题。因此 CI_Base 也不再需要从 CI_Loader 继承了。不过这也留下了隐患(CI_Loader 实例要什么时候获取呢?),所以在 CI_Base 的继承类 Controller 中,只好通过判断是否是运行 PHP5 来决定是不是要实例化一个 CI_Loader。
真的很无语啊,这种设计虽然可以用,但是很糟糕。在 PHP4 种,CI_Loader 的方法和成员变量暴露在了 CI_Base 中。如果应用程序不小心调用了这些方法或使用了这些成员变量。那么应用程序在 PHP5 中运行就会出错。
Controller
Controller 类是所有控制器的基础类。
Controller 实例化时会将 CI_Input、CI_Benchmark、CI_Config、CI_URI、CI_Output、CI_Language 的实例复制到 Controller 实例的成员变量中。然后根据应用程序设置,自动载入文件。
但是这里作者显然没有处理好,所以不得不用 `global $IN, $BM, $CFG, $URI, $LANG, $OUT;` 这样的全局变量来传递几个重要的对象实例。
Controller 本身并没提供 model、helper 的载入服务。这些都由 CI_Loader 来提供。但是,CI_Loader 的各种载入服务,却又用 get_instance() 获取控制器的实例,然后调用 Controller(控制器都是 Controller 的继承类哦)的 _ci_initialize()、_ci_init_database() 等方法来做初始化。
神啊!救救我吧!这种错综复杂的关系,真的要人命啊!
Controller 的 $ci_is_loaded 成员变量用于保存已经载入的对象实例。所以每次用 Controller::_ci_load_model() 载入模块后,都要将该模块登记到 $ci_is_loaded,以避免重复载入。
Controller 里面大部分是一些初始化各种服务的方法,例如初始化数据库、Model 的方法。还有就是用 _ci_scaffolding() 调用 CodeIgniter 的“脚手架”功能。
对 Controller 的设计,没什么好说的,一个字:烂!
CI_Loader
CI_Loader 提供各种载入服务,例如载入 Model、Helper、View 等。但是(我真的很痛恨“但是”这个词),CI_Loader 却需要 Controller 来完成初始化。那么又是谁来调用 CI_Loader 呢?答案是 Controller。
这种紧密的耦合,完全是没有必要的!
控制器开始执行
分析到这里,终于进入应用程序的代码了。应用程序控制器中,可以用 $this->load 来载入各种服务,然后就可以调用这些载入的服务了。
虽然 CodeIgniter 在 CI_Base、Controller 和 CI_Loader 上设计很糟糕,但开发者如果不在乎这些,那么开发过程还是很愉快的。
下面我们再来看看 CodeIgniter 主要服务的特点。
数据库访问
与大部分框架不同,CodeIgniter 的 Model 类没有提供数据库访问功能。所有数据库操作都是通过数据库驱动程序来进行的。
所有数据库驱动均继承自 CI_DB 类。等等,我怎么找不到 CI_DB 类的定义呢?因为 CI_DB 类是在 Controller 中用 `eval(‘class CI_DB extends CI_DB_driver { }’);` 这行代码来定义的。定义这样一个空壳,估计是作者为以后扩充数据库驱动留下的伏笔。
CodeIgniter 的数据库驱动,功能都很简单,和 AdoDB Lite 类似,但是缺乏 AdoDB Lite 那么多的扩展库。我个人认为反倒不如用 AdoDB Lite 来替换这部分。当然了,CodeIgniter 目前已经有不少数据库驱动了,所以替换成 AdoDB Lite 好处不多。
CodeIgniter 也提供了一个 ActiveRecord 实现,不过这个 ActiveRecord 可没有一点半点的“ORM”能力。但是 CodeIgniter 的 ActiveRecord 不需要为每一个数据表都构造一个实例。通常一个实例就可以处理多个数据表的操作。
例如 `$query = $this->db->get(‘mytable’);` 和 `$query = $this->db->get(‘mytable2′);` 就可以分别取得 mytable 和 mytable2 的数据。
说实话,作者可能用错了名字。
CodeIgniter 中的“ActiveRecord”实际上是表数据入口模式——TableDataGateway。
CodeIgniter 中的 ActiveRecord 基本上只是一个对数据表进行 CRUD 操作的公共接口。没有提供 RoR、CakePHP、FleaPHP 等框架具有的数据表关联自动处理能力。和自己写 SQL 相比,没什么优势。唯一的好处就是作者所说的可以让 ActiveRecord 来生成这些简单的 SQL 语句,而不用自己写,提高应用程序在不同数据库之间移植的能力。
“脚手架”功能
CodeIgniter 中提供了基本的“脚手架”功能,可以用几行代码即实现一个对某个数据表进行 CRUD 的界面。这和 phpMyAdmin 中的数据浏览、编辑页面类似,当然功能要简单得多。
“脚手架”有什么实用价值,众说纷纭。但普遍认同的一点就是“脚手架”功能为处于开发初期的应用程序提供了管理数据的界面。开发者可以在后期替换掉“脚手架”的界面。
但是,CodeIgniter 也太简单了,就只有 CRUD 操作,还不如 phpMyAdmin 好用。
其他
CodeIgniter 还有许多其他的类和助手。这些类基本上都属于提供各种辅助服务的范畴。有些类很不错,像图片操作。但大部分类和助手实在太简单,缺乏实用价值。像数据验证助手,只能做很基本的验证,在绝大多数应用程序里面都不能满足要求。
发表评论
-
PHP stream_context_create()作用和用法分析
2013-04-03 10:28 0创建并返回一个文本数据流并应用各种选项,可用于fopen(), ... -
PHP - Iterator接口的解释
2012-12-06 14:23 902Iterator的接口定义如下: Iterato ... -
php中exec,system及passthru等函数用法
2012-08-13 10:49 1071由于PHP基本是用于WEB程 ... -
HTTP协议状态码详解(HTTP Status Code)
2012-08-13 10:41 1016使用php或者javascript都会 ... -
spl_autoload_register 函数详解
2012-06-19 11:45 6719spl_autoload_register (PHP 5 &g ... -
PHP 程序员学数据结构与算法之《栈》
2012-11-24 17:01 1253介绍 “要成高 ... -
MySQL字段类型
2012-03-13 12:21 894MySQL支持大量的列类型 ... -
20个数据库设计的最佳实践
2012-02-27 10:33 11131、使用定义明确的表或列名,并保持一致(例如,School、S ... -
PHP中curl_setopt的CURLOPT系列 选项(转)
2012-01-17 15:41 3453curl_setopt()函数将为一个CURL会话设置选项。 ... -
2011年最热门的开源PHP项目回顾
2012-01-01 12:07 1179本文来自于对活跃在SourceForge和GitHub上的项目 ... -
PHP开发者常犯的10个MySQL错误
2012-01-01 12:03 917数据库是WEB大多数应用 ... -
PHP XML操作类DOMDocument
2011-08-29 14:18 1375不得不自已写一个.XML ... -
二十五个顶级PHP模板引擎整理
2011-08-09 17:20 1050为了找到一个好的模板引擎,我在互联网上进行搜索,目前已经整理出 ... -
php接收二进制数据流转换成图片
2011-08-04 17:49 11458<?php /** * 图片类 * @au ... -
PHP性能优化贴士——产生高度优化代码
2011-07-19 09:43 988PHP是一种在服务器端执 ... -
PHP register_shutdown_function函数详解
2011-07-18 11:47 1427脚本时常死掉,而且并不总是那么好看. 我们可不想给用户 ... -
PHP程序员最常犯的11个MySQL错误
2011-06-30 15:58 719对于大多数web应用来说,数据库都是一个十分基础性的部 ... -
简述MVC思想与PHP如何实现MVC
2011-06-20 11:17 888我相信已经有很多这样 ... -
PHP中的生成XML文件的4种方法
2011-06-15 11:56 2513<?xml version="1.0&qu ... -
stdClass的介绍
2011-06-02 10:11 1102在PHP开发中,很多时候都会看到别人的代码里有 $use ...
相关推荐
2. **安装与配置**:安装CodeIgniter非常简单,通常涉及下载框架的ZIP文件,解压到服务器的适当位置,并配置基本的 `.htaccess` 和 `index.php` 文件。开发者可以通过修改配置文件来适应自己的项目需求。 3. **URL...
在深入探讨《php100:CodeIgniter框架教程(3)(第17讲)》的相关知识点之前,我们先来了解一下CodeIgniter框架的基本概念及其在PHP开发中的地位。CodeIgniter是一款轻量级、高性能的PHP框架,旨在简化Web应用的开发...
这就是CodeIgniter框架整合Smarty引擎的基本过程。通过这种方式,你可以利用Smarty的强大功能,如模板继承、插件、函数等,来提高代码的可维护性和灵活性。同时,CodeIgniter的MVC架构将使你的项目结构更加清晰,...
1. **安装**:下载CodeIgniter框架并上传到服务器,配置好基本的服务器环境,如PHP和MySQL。 2. **创建控制器**:创建第一个控制器文件,例如`Welcome.php`,并定义一个或多个方法来处理请求。 3. **建立模型**:...
### CodeIgniter框架简介 CodeIgniter(简称CI)是一款简单、优雅且功能强大的PHP Web开发框架,旨在简化Web应用开发流程并提高开发效率。它采用MVC(Model-View-Controller)架构模式,并通过丰富的库函数支持,...
2. **CodeIgniter用户指南(v1.7.2).chm**:这是CodeIgniter 1.7.2版本的官方用户指南,虽然版本较旧,但仍然包含了许多基本概念和最佳实践。该指南通常以实例为主,让开发者能够通过实际操作学习如何构建应用程序...
通过本节内容的学习,读者应该能够对CodeIgniter框架有一个较为全面的了解,并掌握其基本的使用方法。CodeIgniter不仅适用于小型项目,也能够在大型项目中发挥重要作用。对于想要快速构建Web应用的开发者来说,它是...
1. 下载最新版本的CodeIgniter框架。 2. 解压到服务器的Web根目录下。 3. 配置 `.htaccess` 文件以隐藏默认的index.php入口文件。 4. 修改 `config/config.php` 文件设置站点基本信息,如base_url等。 5. 创建数据库...
### CodeIgniter框架详解 #### 一、CodeIgniter简介 ...CodeIgniter通过其简洁的API和低学习曲线受到了广大开发者...通过本文的介绍,希望能帮助大家更好地理解和掌握CodeIgniter框架的基本用法及其核心组件的使用方法。
2. **codeIgniter框架基本结构分析【中级教程】.docx**: 这份中级教程文档深入探讨了CodeIgniter框架的内部工作原理和架构。它可能包含对框架的核心组件如路由、加载器、URI类、模型-视图-控制器(MVC)模式的详细...
在提供的`CodeIgniter.chm`文件中,应该包含了以上各个知识点的详细教程和示例,对于初学者来说,是全面了解和掌握CodeIgniter框架的好资料。通过深入学习,开发者可以利用CI框架高效地构建稳定、安全的PHP Web应用...
这篇文章是有关 CodeIgniter 的(以下简称 CI),CI 是一个达成以上目标的框架。 如果你只是要达成一个最终的结果,而把中间所有的编码细节和复杂统统丢给一个框架,CI 是你最好的朋友。 CI 有很多优点:免费,轻...
什么是CodeIgniter CodeIgniter是一个应用程序开发框架-一个工具包-适用于使用PHP构建网站的人们。 它的目标是通过提供一组用于执行常见任务的库以及一个简单的界面和逻辑结构来访问这些库,从而使您比从头开始编写...
首先,我们需要了解Codeigniter框架的基本概念和历史。Codeigniter在汉语中可以翻译为“代码点火器”,它的logo就是一个小火苗,象征着启动项目的强大力量。Codeigniter的历史可以追溯到2006年2月28日,这是它的1.0...
安装CodeIgniter相当简单,只需下载最新版本的框架,解压到服务器根目录,然后通过修改config.php和database.php文件进行基本配置,包括数据库连接信息等。 三、MVC架构 在CodeIgniter中,模型处理数据逻辑,视图...
首先,CodeIgniter框架的一个重要特点是其MVC架构。MVC架构将程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。模型主要负责数据的处理,视图负责展示数据,控制器则用来处理用户的请求。...
在“codeigniter 权限系统”这个主题中,我们将深入探讨如何在CodeIgniter框架中构建一个完整的权限管理系统。 首先,权限系统的核心是角色-基于权限(RBAC, Role-Based Access Control)模型。在RBAC中,用户被...
首先,CodeIgniter框架主要目标是简化PHP开发工作,它提供了大量内置的类库,帮助开发者处理日常任务,并通过简单的接口和逻辑结构,减少代码编写量,提高开发效率。框架定位清晰,旨在为开发者提供一个轻巧、快速、...
《Professional CodeIgniter》是一本专门针对CodeIgniter框架的专业开发图书,旨在为读者提供权威且深入的CI框架知识。CodeIgniter(简称CI)是一款轻量级的PHP框架,以其高效性能、简单易用和丰富的功能而广受...
总之,"CodeIgniter 中文手册1.6.3版本"是学习和掌握CodeIgniter框架的重要参考资料,它涵盖了框架的基本概念、核心组件以及实际开发中的应用技巧。通过深入学习和实践,开发者可以利用CodeIgniter快速构建出高效、...