打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一步步编写PHP的Framework(十八)

一步步编写PHP的Framework(十八)

发布时间:2012-12-24 17:16:59   来源:   评论:0 点击: 次 【字号:大 中 小】
QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 百度空间 百度搜藏 开心网 复制 更多 0
上一次我们把模型的驱动类实现了,由于ConnectionManager需要按照配置文件中配置的驱动名实例化驱动类,所以我们先在配置文件中加入驱动名:01<?php02returnarray(03'defaultController'=>'Index&#3...
   

 

上一次我们把模型的驱动类实现了,由于ConnectionManager需要按照配置文件中配置的驱动名实例化驱动类,所以我们先在配置文件中加入驱动名:

01 <?php
02 return array(
03     'defaultController' => 'Index',
04     'defaultAction' => 'index',
05     'debug' => true,
06     'errorReporting' => -1,
07     'timeZone' => 'PRC',
08     'db' => array(
09         'dsn' => 'mysql:dbname=test;host=localhost',
10         'user' => 'test',
11         'pwd' => 'test',
12         'driver' => 'pdo'
13     )
14 );

这里面的db下面的driver就是驱动名。

 

配置文件弄好之后,ConnectionManager这个类的两个静态方法:getConnection和releaseConnection的实现就很简单了,首先getConnection就是按照配置文件中的配置选择一个驱动类,然后实例化,当然,由于以后模型文件可能有多个,然后数据库的连接最好只有一个,所以这个地方必须是单例的,releaseConnection就更简单了,直接调用驱动类的close方法即可。

01 <?php
02 class ConnectionManager extends Base {
03     private static $_instance = null;
04     public static function getConnection() {
05         if(self::$_instance == null) {
06             //按照配置文件寻找驱动类,然后连接DB
07             switch(C('db=>driver')) {
08                 case 'pdo' :
09                     self::$_instance = new PdoDriver();
10                     break;
11                 default :
12                     self::$_instance = new PdoDriver();
13                     break;
14             }
15         }
16         return self::$_instance;
17     }
18     public static function releaseConnection() {
19         if(null !== self::$_instance) {
20             self::$_instance.close();
21         }
22     }
23 }

ConnectionManager写完之后,我们再讲ModelBase,由于这个类是后面的表模型和关系模型的父类,所以它基本上定义了外部可访问的所有接口,如execute,select,update,insert,delete等。现在我们先写一个比较简单的ModelBase,这个例子中只有构造函数,execute,getAll三个方法,execute就是执行一个SQL,getAll就是获取数据。

注:如果按照之前我们讲的可以按照对象,普通数组或者Iterator返回数据,那么此处的getAll就比较复杂了,但是现在我们在getAll中就直接调用getAllByAssocArray,这样这个方法就非常简单了。

好了,话不多说,直接贴代码吧!!

01 <?php
02 class ModelBase extends Base {
03     protected $_db = null;
04     public function __construct() {
05         $this->_db = ConnectionManager::getConnection();
06     }
07     public function execute($sql,Array $arr) {
08         $this->_db->prepare($sql);
09         $this->_db->execute($arr);
10     }
11     public function getAll() {
12         return $this->_db->getAllByAssocArray();
13     }
14 }

 

由于此处没有几行代码,所以就不讲了,下面讲一下复杂一点的东西了啊。。。

我之前在B这一块儿还分了一个Sql Parse,它主要完成SQL的解析,我们知道一个简单的查询语句格式如下:

SELECT  [ALL|DISTINCT]  Field FROM Table  WHERE whereCondition [GROUP BY groupCondition] [HAVING havingCondition] [ORDER BY orderCondition] 

之前我们都是直接写一个SQL字符串,这种方式不利于我们扩展,如果我们只需要指定SQL的一部分内容,其他的内容框架可以自动完成,这样维护起来容易一些,当然,复杂的SQL我不建议这么做。

就比如在表模型中,我们是指定了表名的,那么框架应该可以识别出来Table这一块儿,还有Field这部分可以默认为*,whereCondition如果没有可以不写,All或DISTINCT默认是ALL即可。

现在假设在一个表模型中,关联的表为user,那么执行一个$this->select(),按照原来的观点系统根本不知道查询的语句是什么,自然也就无法执行了,但是如果框架可以自动完成SQL的话,这个SQL就变成了:

SELECT * FROM user

这样一个SQL语句是没有任何问题的。


(责任编辑:php1001)
本文关键字:
  • 一步步 编写 Framework
  • 上一篇:一步步编写PHP的Framework(十七)

    本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
    打开APP,阅读全文并永久保存 查看更多类似文章
    猜你喜欢
    类似文章
    【热】打开小程序,算一算2024你的财运
    c3p0单例模式
    数据库连接JDBC连接池组件C3P0的使用方法
    高性能jdbc封装工具 Apache Commons DbUtils 1.6(转载)
    JDBC---将数据库连接信息放置配置文件中
    JDBC使用+数据库连接池+springJDBC
    彻底理解ThreadLocal
    更多类似文章 >>
    生活服务
    热点新闻
    分享 收藏 导长图 关注 下载文章
    绑定账号成功
    后续可登录账号畅享VIP特权!
    如果VIP功能使用有故障,
    可点击这里联系客服!

    联系客服