博客列表 >PHP大牛成长之路:构造方法、拦截器与查询构造器实现DB类

PHP大牛成长之路:构造方法、拦截器与查询构造器实现DB类

周Sir-BLOG
周Sir-BLOG原创
2020年07月29日 23:45:54729浏览

1、构造方法(魔术方法,公共方法)

  • __construct() 构造方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct() 。

2、重载(访问拦截器)

  • 2.1 魔术方法: __get (访问未定义或无权限访问的属性时被调用)

Demo类中两个属性均为私有属性,访问时自动跳到 __get 魔术方法拦截进行访问。

  • 2.2 魔术方法: __set (给未定义的属性赋值时被调用)

Demo类中两个属性均为私有属性,赋值时自动跳到 __set 魔术方法拦截进行赋值。

  • 2.3 魔术方法: __isset (对未定义的属性、不可访问或空 isset()时被调用)

Demo类中属性$name为私有属性,isset()时自动跳到 __isset 魔术方法拦截进行检查。

  • 2.3 魔术方法: __unset (销毁无法访问属性unset()时被调用)

Demo类中属性$name为私有属性,unset()时自动跳到 __unset 魔术方法拦截进行销毁。

  • 2.3 魔术方法: __call 方法拦截器与 __callStatic静态方法拦截器

3、小案例:查询构造器实现DB类

  1. // 方法委托/方法拦截器 实战: 数据库查询构造器(链式查询)
  2. // 查询类
  3. class Query
  4. {
  5. // 连接对象
  6. protected $db;
  7. // 数据表
  8. protected $table;
  9. // 字段列表
  10. protected $field;
  11. // 记录数量
  12. protected $limit;
  13. protected $values;
  14. protected $where;
  15. // 构造方法: 连接数据库
  16. public function __construct($dsn, $username, $password)
  17. {
  18. $this->connect($dsn, $username, $password);
  19. }
  20. // 连接数据库
  21. private function connect($dsn, $username, $password)
  22. {
  23. $this->db = new PDO($dsn, $username, $password);
  24. }
  25. // 设置默认的数据表名称
  26. public function table($table)
  27. {
  28. $this->table = $table;
  29. return $this;
  30. }
  31. // 设置默认的字段名称
  32. public function field($field)
  33. {
  34. $this->field = $field;
  35. return $this;
  36. }
  37. // 链式方法: 设置查询数量
  38. public function limit($limit)
  39. {
  40. $this->limit = $limit;
  41. return $this;
  42. }
  43. // 设置插入新值
  44. public function values($values)
  45. {
  46. $this->values = $values;
  47. return $this;
  48. }
  49. public function where($where)
  50. {
  51. $this->where = $where;
  52. return $this;
  53. }
  54. // 生成查询语句
  55. protected function getSql($type)
  56. {
  57. switch($type){
  58. case 'i':
  59. return sprintf('INSERT INTO %s (%s) VALUES(%s)', $this->table, $this->field, $this->values);
  60. break;
  61. case 'u':
  62. return sprintf('UPDATE %s SET %s = "%s" WHERE %s', $this->table, $this->field, $this->values, $this->where);
  63. break;
  64. case 'd':
  65. return sprintf('DELETE FROM %s WHERE %s = %s', $this->table, $this->field, $this->values);
  66. break;
  67. case 's':
  68. return sprintf('SELECT %s FROM %s LIMIT %s', $this->field, $this->table, $this->limit);
  69. break;
  70. default:
  71. return 'SQL语句错误!';
  72. }
  73. }
  74. // 执行查询
  75. public function select()
  76. {
  77. return $this->db->query($this->getSql('s'))->fetchAll(PDO::FETCH_ASSOC);
  78. }
  79. // 执行插入
  80. public function insert()
  81. {
  82. return $this->db->query($this->getSql('i'));
  83. }
  84. // 执行删除
  85. public function delete()
  86. {
  87. return $this->db->query($this->getSql('d'));
  88. }
  89. // 执行更新
  90. public function update()
  91. {
  92. return $this->db->query($this->getSql('u'));
  93. }
  94. }
  95. // 数据据操作类
  96. class DB
  97. {
  98. // 静态方法委托
  99. public static function __callStatic($name, $args)
  100. {
  101. // 获取到查询类的对象: new Query()
  102. $dsn = 'mysql:host=localhost;dbname=php_pro';
  103. $username = 'root';
  104. $password = 'root';
  105. $query = new Query($dsn, $username, $password);
  106. // 直接跳到Query类中的具体方法来调用
  107. return call_user_func([$query, $name], ...$args);
  108. }
  109. }
  110. //查询
  111. $result = DB::table('users')
  112. ->field('id,username,email')
  113. ->limit(5)
  114. ->select();
  115. print_r($result);
  116. //添加
  117. $result = DB::table('users')
  118. ->field('username,age,email,password')
  119. ->values("'arwang',33,'arwang@php.cn', md5('123456php.pro')")
  120. ->insert();
  121. echo $result ? '添加成功' :'添加失败';
  122. //删除
  123. $result = DB::table('users')
  124. ->field('id')
  125. ->values(12)
  126. ->delete();
  127. echo $result ? '删除成功' :'删除失败';
  128. //更新
  129. $result = DB::table('users')
  130. ->field('username')
  131. ->values('arwang888')
  132. ->where('id = 32')
  133. ->update();
  134. echo $result ? '更新成功' :'更新失败';

总结:

  • 查询构造器实现DB类还不是很明白,链式方法是怎么定义的?
  • 如果要使用问号占位符,使用execute()方法执行,试了好久没成功;
  • update()操作不知道字段如何批量操作,作业只实现了修改单个字段。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议