搜索
博主信息
博文 63
粉丝 8
评论 8
访问量 63761
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
PHP大牛成长之路:构造方法、拦截器与查询构造器实现DB类
周Sir-BLOG
原创
904人浏览过

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举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学