+ -
当前位置:首页 → 问答吧 → [学习] CodeIgniter 走马观花[下]

[学习] CodeIgniter 走马观花[下]

时间:2006-09-17

来源:互联网

晕,超过 10000 字限制。。。。。。。。。

只好分为两部分了。

============================================================

接:http://www.phpchina.cn/bbs/viewthread.php?tid=9757

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 是一个:简单不简洁、好用但可能不够用的工具。

几个步骤就可以让你的应用程序跑起来,所以简单。因为简单,所以好用。但糟糕的设计增加了复杂度,简单的表面下是错综复杂的对象关系。因为过于简单,所以可能不够用。

如果你只是开发很简单的应用程序,那么 CodeIgniter 完全可以满足你的需求。而且你也会获得愉快的体验。

但如果应用程序具有一定的复杂度,CodeIgniter 就可能起到反作用。因为 CodeIgniter 在几个主要类上的糟糕设计,你的应用程序最终也会受到牵连。而且 CodeIgniter 缺乏许多必须的服务,例如访问控制、用户管理、自动化的数据表关联处理、复杂缓存等。

这些服务对于一个较为复杂的应用程序来说都是必须的。如果用 CodeIgniter 作为应用程序框架,那么这些服务都需要自己实现。这时 CodeIgniter 带来的好处就很少了。


黄金时段,播出广告
和 CodeIgniter 一样好用,跟 CakePHP、Symfony、Zend Framework 一样“差不多”强大 ―― FleaPHP 是你最贴心的选择!

请不要扔杂物,此广告属于公益性质!

FleaPHP 是一个开放源代码,完全兼容 PHP4 和 PHP5,易学易用,高度模块化和开放的应用程序开发框架。

FleaPHP 相比 CodeIgniter,有下列优势:

-  一样的好用。如果你看不懂英文,那么 FleaPHP 就更好用了,因为文档、源代码注释都是中文的;
-  更多的功能。包括自动化数据表关联处理、访问控制、用户管理等;
-  更高的性能。也许你不知道,一个典型的 CodeIgniter 应用程序需要载入 17 至 25 个文件,而 FleaPHP 应用程序只需要 10 - 18 个文件,而且还提供更多的功能。同时,FleaPHP 高度的模块化结构,使得应用程序最少只需要 6 个文件就可以运行(还包括基本的数据库访问服务);
-  中文社区,可以更容易的获得帮助;
-  清晰的设计架构,可以很容易的扩充和修改。

FleaPHP 相比 CakePHP、Symfony、Zend Framework 的不足:

-  没有那么大的名气和人气;
-  缺少对 Ajax 的支持;
-  缺乏高级的缓存服务;
-  文档没有那么齐全。

目前,FleaPHP 团队正在努力完善文档,并丰富功能。如果你有兴趣,可以花上2分钟看看下面这篇文章的开头,然后再决定是否要花更多的时间来了解 FleaPHP。

http://www.fleaphp.org/node/36

作者: dualface   发布时间: 2006-09-17


也祝楼主的FleaPHP 越来越强大

作者: fengyun   发布时间: 2006-09-17

不错,关注中
虽然不太懂

作者: xiaojia   发布时间: 2006-09-18

免费的里面,哪个框架好一些,不妨推荐几个,供小编们学习哈

作者: leobyrds   发布时间: 2006-09-18

楼主辛苦了

作者: scorpion   发布时间: 2006-09-18

关注FleaPHP的高级缓存服务。
:)

作者: Bantu   发布时间: 2006-09-18

:)

作者: lmhllr   发布时间: 2006-09-19

FleaPHP军团跟上~~

作者: skyblue1984   发布时间: 2006-09-19

fleaphp 跟上。。

作者: szy_session1987   发布时间: 2006-09-22

写得不错的中伤帖!

作者: 讨厌伪善   发布时间: 2006-12-14

�τ��侵鞯娜烁裎沂��]得�f的!-��
��有,如果世界上只有一��fleaphp框架的��我也是不��用你的!

作者: liexusong   发布时间: 2007-09-27