# 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 <?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)); ~~~