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

日期:2006-09-26  作者:喜腾小二  来源:PHPChina


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

<<<返回技术中心

技术文章

站内新闻

我要啦免费统计