行健网络

?找回密码
?立即注册
查看: 3881|回复: 1
打印 上一主题 下一主题

各模块是怎样实现对数据库的操作(MVC模型的实现过程)

[复制链接]
跳转到指定楼层
楼主
发表于 2014-7-26 08:22:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

模块要实现自己的功能很多时候离不开对数据的操作:增加、删除、更新本模块的数据。那它是怎样实现的呢?具体过程是怎样?

在/phpcms/libs/classes/目录下有一个数据模型基类model.class.php文件,是各个模块数据模型类的基类。

? ?? ? 在这个类中首先用pc_base:load_sys_class()方法加载数据库工厂类但未初始化,因为它有获取静态实例的方法。我们先不看model.class.php数据模型基类的成员方法,来分析下它的构造函数:
  1. /**
  2. *??model.class.php 数据模型基类
  3. *
  4. * @copyright? ?? ?? ?? ?? ?? ?? ?? ?(C) 2005-2010 PHPCMS
  5. * @license? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???[url=http://www.phpcms.cn/license/]http://www.phpcms.cn/license/[/url]
  6. * @lastmodify? ?? ?? ?? ?? ?? ?? ?? ?2010-6-7
  7. */
  8. defined('IN_PHPCMS') or exit('Access Denied');
  9. pc_base::load_sys_class('db_factory', '', 0);
  10. class model {? ?
  11. ? ?? ???//数据库配置
  12. ? ?? ???protected $db_config = '';
  13. ? ?? ???//数据库连接
  14. ? ?? ???protected $db = '';
  15. ? ?? ???//调用数据库的配置项
  16. ? ?? ???protected $db_setting = 'default';
  17. ? ?? ???//数据表名
  18. ? ?? ???protected $table_name = '';
  19. ? ?? ???//表前缀
  20. ? ?? ???public??$db_tablepre = '';
  21. ? ?? ???
  22. ? ?? ???public function __construct() {
  23. ? ?? ?? ?? ?? ? if (!isset($this->db_config[$this->db_setting])) {
  24. ? ?? ?? ?? ?? ?? ?? ?? ?$this->db_setting = 'default';
  25. ? ?? ?? ?? ?? ? }
  26. ? ?? ?? ?? ?? ? $this->table_name = $this->db_config[$this->db_setting]['tablepre'].$this->table_name;
  27. ? ?? ?? ?? ?? ? $this->db_tablepre = $this->db_config[$this->db_setting]['tablepre'];
  28. ? ?? ?? ?? ?? ? $this->db = db_factory::get_instance($this->db_config)->get_database($this->db_setting);
  29. ? ?? ???}
  30. ? ?? ?? ?? ?? ?
  31. }
  32. ?>
复制代码

1、确定数据库配置列表中的配置选项,其数据库配置列表项在/caches/configs/database.php文件中,通过pc_base类静态方法load_config()加载。请见。。。。

2、根据数据库配置项获取数据库表的前缀,此时的数据库表名尚未确定。表名的确定一般是在控制器需要操作某个表的时候临时指定。它是通过指定模块数据模型类(一般在/phpcms/model目录下,例如content模块的数据模型类是/phpcms/mode/content_mode.class.php文件)的table_name成员属性,而模块数据模型类都继承于数据模型基类,我们知道子类是会覆写父类相同名称属性的。这样也就确定了数据模型基类实例的table_name属性。

3、通过数据库工厂类get_instance()方法获取工厂类的静态实例,然后再通过工厂类的静态实例的get_database()方法获得数据库操作实例,也就是数据库驱动。现在,我们来看下数据库工厂类/phpcms/libs/classes/db_factory.class文件中的get_database()方法与该方法所调用的connect()方法。

  1. /**
  2. *??db_factory.class.php 数据库工厂类
  3. *
  4. * @copyright? ?? ?? ?? ?? ?? ?? ?? ?(C) 2005-2010 PHPCMS
  5. * @license? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???http://www.phpcms.cn/license/
  6. * @lastmodify? ?? ?? ?? ?? ?? ?? ?? ?2010-6-1
  7. */

  8. final class db_factory {
  9. ? ?? ???
  10. ? ?? ???/**
  11. ? ?? ?? ?* 当前数据库工厂类静态实例
  12. ? ?? ?? ?*/
  13. ? ?? ???private static $db_factory;
  14. ? ?? ???
  15. ? ?? ???/**
  16. ? ?? ?? ?* 数据库配置列表
  17. ? ?? ?? ?*/
  18. ? ?? ???protected $db_config = array();
  19. ? ?? ???
  20. ? ?? ???/**
  21. ? ?? ?? ?* 数据库操作实例化列表
  22. ? ?? ?? ?*/
  23. ? ?? ???protected $db_list = array();
  24. ? ?? ???
  25. ? ?? ???/**
  26. ? ?? ?? ?* 构造函数
  27. ? ?? ?? ?*/
  28. ? ?? ???public function __construct() {
  29. ? ?? ???}
  30. ? ?? ???
  31. ? ?? ???/**
  32. ? ?? ?? ?* 返回当前终级类对象的实例
  33. ? ?? ?? ?* @param $db_config 数据库配置
  34. ? ?? ?? ?* @return object
  35. ? ?? ?? ?*/
  36. ? ?? ???public static function get_instance($db_config = '') {
  37. ? ?? ?? ?? ?? ? if($db_config == '') {
  38. ? ?? ?? ?? ?? ?? ?? ?? ?$db_config = pc_base::load_config('database');
  39. ? ?? ?? ?? ?? ? }
  40. ? ?? ?? ?? ?? ? if(db_factory::$db_factory == '') {
  41. ? ?? ?? ?? ?? ?? ?? ?? ?db_factory::$db_factory = new db_factory();
  42. ? ?? ?? ?? ?? ? }
  43. ? ?? ?? ?? ?? ? if($db_config != '' && $db_config != db_factory::$db_factory->db_config) db_factory::$db_factory->db_config = array_merge($db_config, db_factory::$db_factory->db_config);
  44. ? ?? ?? ?? ?? ? return db_factory::$db_factory;
  45. ? ?? ???}
  46. ? ?? ???
  47. ? ?? ???/**
  48. ? ?? ?? ?* 获取数据库操作实例
  49. ? ?? ?? ?* @param $db_name 数据库配置名称
  50. ? ?? ?? ?*/
  51. ? ?? ???public function get_database($db_name) {
  52. ? ?? ?? ?? ?? ? if(!isset($this->db_list[$db_name]) || !is_object($this->db_list[$db_name])) {
  53. ? ?? ?? ?? ?? ?? ?? ?? ?$this->db_list[$db_name] = $this->connect($db_name);
  54. ? ?? ?? ?? ?? ? }
  55. ? ?? ?? ?? ?? ? return $this->db_list[$db_name];
  56. ? ?? ???}
  57. ? ?? ???
  58. ? ?? ???/**
  59. ? ?? ?? ?*??加载数据库驱动
  60. ? ?? ?? ?* @param $db_name? ?? ?? ?数据库配置名称
  61. ? ?? ?? ?* @return object
  62. ? ?? ?? ?*/
  63. ? ?? ???public function connect($db_name) {
  64. ? ?? ?? ?? ?? ? $object = null;
  65. ? ?? ?? ?? ?? ? switch($this->db_config[$db_name]['type']) {
  66. ? ?? ?? ?? ?? ?? ?? ?? ?case 'mysql' :
  67. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pc_base::load_sys_class('mysql', '', 0);
  68. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$object = new mysql();
  69. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???break;
  70. ? ?? ?? ?? ?? ?? ?? ?? ?case 'mysqli' :
  71. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$object = pc_base::load_sys_class('mysqli');
  72. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???break;
  73. ? ?? ?? ?? ?? ?? ?? ?? ?case 'access' :
  74. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$object = pc_base::load_sys_class('db_access');
  75. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???break;
  76. ? ?? ?? ?? ?? ?? ?? ?? ?default :
  77. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???pc_base::load_sys_class('mysql', '', 0);
  78. ? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???$object = new mysql();
  79. ? ?? ?? ?? ?? ? }
  80. ? ?? ?? ?? ?? ? $object->open($this->db_config[$db_name]);
  81. ? ?? ?? ?? ?? ? return $object;
  82. ? ?? ???}

  83. ? ?? ???/**
  84. ? ?? ?? ?* 关闭数据库连接
  85. ? ?? ?? ?* @return void
  86. ? ?? ?? ?*/
  87. ? ?? ???protected function close() {
  88. ? ?? ?? ?? ?? ? foreach($this->db_list as $db) {
  89. ? ?? ?? ?? ?? ?? ?? ?? ?$db->close();
  90. ? ?? ?? ?? ?? ? }
  91. ? ?? ???}
  92. ? ?? ???
  93. ? ?? ???/**
  94. ? ?? ?? ?* 析构函数
  95. ? ?? ?? ?*/
  96. ? ?? ???public function __destruct() {
  97. ? ?? ?? ?? ?? ? $this->close();
  98. ? ?? ???}
  99. }
  100. ?
复制代码

从connect()方法,可以看出数据库驱动共有三种:mysql(/phpcms/libs/classes/mysql.class.php)、mysqli、db_access(微软的access数据库,/phpcms/libs/classes/db_access.class.php),这三种驱动,才是真正操作数据库的“底层”接口。它直接应用PHP操作数据库的函数。

重新梳理下过程:数据模型基类的通过调用工厂类静态实例的get_database()方法获得真正的数据库操作实例(数据库驱动),并执行了数据库操作实例的open方法(主要是连接数据库,设置字符编码集,并选择数据库)。最终返回数据库操作实例。也就是说数据模型基类的实例属性$this->db就是数据库操作实例。

数据模型基类的操作数据库的方法,都是通过调用自身的成员属性$this->db(数据库操作实例)的底层方法来进行的。数据模型基类操作数据库的成员方法其实就是对数据库操作实例的成员方法的包装与扩展。

? ?? ? 而模块数据模型类又继承于数据模型基类,所以模块数据模型类的实例也就可以调用其父类数据模型基类的方法。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|网站地图|行健网络

GMT+8, 2019-10-17 23:08 , Processed in 0.060564 second(s), 17 queries .

Powered by Discuz! X3.2

? 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表