发新话题
打印

看了看Zend_Db

看了看Zend_Db

作者:老王

篮球场上所有说姚明“坏话”的人,一般都会被称为“姚黑”。我现在也处在一个类似的角色,只不过我是“ZF黑”。很多人说我不了解Zend Framework就说些不负责任的话。为了改正缺点,我今天晚上仔细看了一下Zend_Db部分。

为什么选择Zend_Db入手呢,因为在MVC结构中,M是灵魂所在,一个软件的好与坏很大程度上是有M来决定的。而对于一个Web项目而言,M不可避免的要涉及大量的CRUD操作,所以,在ZF中,Zend_Db的地位就会显得相对更重要一些。

在Zend_Db组件中,大致包括了一下几个部分:

Zend_Db_Adapter
Zend_Db_Statement
Zend_Db_Profiler
Zend_Db_Select
Zend_Db_Table
Zend_Db_Table_Row
Zend_Db_Table_Rowset
Zend_Db_Table Relationships

Zend_Db_Adapter是Zend Framework的数据库抽象层api。基于pdo,你可以使用 Zend_Db_Adapter 连接和处理多种数据库,包括:Microsoft SQL Server,MySql,SQLite等等。就像它的名字一样,这是一个适配器模式的具体应用,如果你使用DAO方式去操作数据库的话,它是一个选择。

Zend_Db_Statement是Zend Framework的预编译对象。在下列两种操作时会返回一个预编译对象:
--------------------------------------------------------------------------------------------------
Zend_Db_Statment|PDOStatement          prepare          (string|Zend_Db_Select $sql)
Zend_Db_Statement_Interface query (mixed $sql, [mixed $bind = array()])
--------------------------------------------------------------------------------------------------
有了Zend_Db_Statement,可以方便的做一些诸如fetchAll之类的操作。

Zend_Db_Adapter和Zend_Db_Statement虽然从代码实现上中规中矩,但是不可否认的是,他们过于底层,应用范畴也和传统的手写SQL类似,不太符合现在的口味。

Zend_Db_Profiler主要的优点是方便了跟踪调试,这里不做讨论。

Zend_Db_Select是一种不受数据库约束构建select的sql语句的工具,这是文档里的原话。但是老实说,用Zend_Db_Select虽然可以帮助你生成可移植性更好的SQL,但编写过程相当无趣,而且代码丑陋,有滥用OO之嫌。
--------------------------------------------------------------------------------------------------
// 你可以使用一种重复定义的方式...
$select->from('round_table', '*');
$select->where('noble_title = ?', 'Sir');
$select->order('first_name');
$select->limit(10,20);

// ...或者使用一种连续定义的方式:
$select->from('round_table', '*')
            ->where('noble_title = ?', 'Sir')
            ->order('first_name')
            ->limit(10,20);
--------------------------------------------------------------------------------------------------
似乎多了几个->就OO了,可惜这不过是皇帝的新衣罢了。

Zend_Db_Table是PoEAA中表数据入口的实现。不过仅封装了最简单的CRUD操作。现在我看phpchina论坛里讨论的流行做法,似乎就是Model类都从Zend_Db_Table继承来做,不过由于Zend_Db_Table本身的无能,遇到类似与连表查询之类的稍微复杂点的操作,Zend_Db_Table基本就Over了,还需要借助很多别的东西来实现。

Zend_Db_Table_Row是PoEAA中行数据入口的实现,也可以通过继承Zend_Db_Table_Row_Abstract来扩展它,那就是一个PoEAA中活动记录的实现了。在操作Zend_Db_Table的时候,如果返回的是一个结果一般就是Zend_Db_Table_Row,返回多行就是Zend_Db_Table_Rowset。

Zend_Db_Table_Rowset封装了一个结果集,我最初还认为这样不错,当时我以为它封装了数据结果集,迭代的时候每次在内存中只处理一个,并置换了属于数据层面的异常处理等等,不像二维数组,是一次性调入内存。但是通过看源代码,发现Zend_Db_Table_Rowset的实质还是一个二维数组,并没有按我预想的那样。

Zend_Db_Table Relationships,基本上任何一个PHP框架的类似实现都比它强,不说了,我先消消气去。

TOP

发新话题