yaf mysql pdo 封装_PDO 操作数据库

# PDO 操作数据库

***

Yaf 框架(3.0.5版本)目前并没有提供数据库 ORM 类,据鸟哥的博客来说,以后或许会提供。使用了 ORM 类为团队带来的便捷和规范,但是带来了性能的下降。直接使用 PDO 保证性能,又存在规范不足让程序维护成本上升或安全上的风险。这就要各位读者自行取舍。

> ORM 即 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。[来自维基百科]

> 笔者注:简单来说 ThinkPHP5 的 Db 方法或者模型,ThinkPHP3 的 M方法和 D方法,Laravel 的 Eloquent 都属于 ORM 类范畴

接下来我们使用单例模式创建 PDO 类

### 1. 创建配置文件选项

打开`conf/application.ini`文件增加数据库配置

~~~

; 数据库配置

resources.database.master.host = "127.0.0.1"

resources.database.master.port = 3306

resources.database.master.dbname = "eye"

resources.database.master.username = "root"

resources.database.master.password = ""

~~~

### 2. 创建 Database 类(单例)

本类并没有添加查询,添加,修改,删除等方法,而是将所有操作重载给 PDO 类实例,导致有些 PDO 的方法在编辑器中没有代码提醒,所以需要使用 `phpDocumentor` 注释语法来开启代码提醒。下方代码前两行注释就是我为 Database 类编写的`query()`操作和`fetchAll()`操作的代码提醒

~~~php

/**

* 方法重载函数,用于编辑器代码提醒

* @method Database query($statement, $mode = PDO::ATTR_DEFAULT_FETCH_MODE, $arg3 = null, array $ctorargs = array())

* @method Database fetchAll($fetch_style = null, $fetch_argument = null, array $ctor_args = array())

*/

class Database

{

// 类实例

private static $instance = null;

// 连接实例

private static $link = null;

// 配置文件

private static $config = [];

/**

* 构造函数

*/

private function __construct()

{

self::$config = Yaf_Registry::get('config')->resources->database->master;

self::$link = new PDO("mysql:host=" . self::$config['host'] . ";dbname=" . self::$config['dbname'], self::$config['username'], self::$config['password'], [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'']);

}

/**

* 获取实例

* @return Database

*/

public static function getInstance()

{

return self::$instance ?: (self::$instance = new self());

}

/**

* 魔术方法,方法重载

* @param $name

* @param $arguments

* @return mixed

*/

function __call($name, $arguments)

{

return self::$link->$name($arguments[0]);

}

/**

* 禁止克隆

*/

private function __clone()

{

}

/**

* 反序列化魔术方法

*/

public function __wakeup()

{

self::$instance = $this;

}

/**

* 析构函数

* @description 销毁实例

*/

public function __destruct()

{

list(self::$instance, self::$config) = [null, []];

}

}

~~~

### 3. 自动加载 Database 类

打开`application/Bootstrap.php`文件,在`_initAutoload()`方法下加入导入类代码,实现自动导入`Database`类

~~~php

public function _initAutoload()

{

// 注册 Composer

Yaf_Loader::import(APPLICATION_PATH . "/vendor/autoload.php");

// 注册数据库

Yaf_Loader::import(APPLICATION_PATH . "/application/library/Database.php");

}

~~~

除了可以使用 Yaf 自带的 `Yaf_Loader` 类来引入 php 库文件以外,也可以使用 `include()`,`require()`等方式引入

### 4. 开始使用

现在就可以在项目中,使用`Database::getInstance()`来 PDO 操作了

~~~php

$rows = Database::getInstance()->query('SELECT `id`,`user_name`,`password` FROM users ORDER BY `id` DESC ;');

ldd($rows->fetchAll(PDO::FETCH_ASSOC));

~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值