博客列表 >了解和演示属性,方法拦截器和查询构造器(0727)

了解和演示属性,方法拦截器和查询构造器(0727)

丶久而旧之丶
丶久而旧之丶原创
2020年08月19日 22:36:10583浏览

魔术方法和方法委托

魔术方法(由某一个事件或者行为来自动触发,不允许用户主动调用)

1.构造方法

  1. <?php
  2. class User
  3. {
  4. public $name;
  5. public $money;
  6. // 构造方法(实例化时自动调用)
  7. public function __construct($name, $money)
  8. {
  9. $this->name = $name;
  10. $this->money = $money;
  11. // 调用get()方法
  12. echo $this->get();
  13. }
  14. protected function get()
  15. {
  16. echo $this->name . ':' . $this->money . '元';
  17. }
  18. }
  19. $user = new User('床垫', 6888);

2.__get()方法(当外部访问类中不存在或者无权限访问属性是会自动调用并处理)

  1. <?php
  2. class User
  3. {
  4. private $name;
  5. private $money;
  6. private $sale;
  7. // 构造方法
  8. public function __construct($name, $money, $sale)
  9. {
  10. $this->name = $name;
  11. $this->money = $money;
  12. $this->sale = $sale;
  13. }
  14. // __get()方法(当外部访问类中不存在或者无权限访问属性是会自动调用并处理)
  15. public function __get($name)
  16. {
  17. // return $this->$name;
  18. // 需要处理并调用相关方法,不然设置protected/private就无意义
  19. $method = 'get' . ucfirst($name);
  20. return method_exists($this, $method) ? $this->$method() : '无权限访问';
  21. }
  22. protected function getName()
  23. {
  24. // 可以过滤一些字符
  25. echo mb_substr($this->name, 0, 11) . '...';
  26. }
  27. protected function getMoney()
  28. {
  29. // 直接输出折后价
  30. echo '折后价' . $this->money * $this->sale;
  31. }
  32. }
  33. $user = new User('手机,iphone11,256G', 8500, 0.8);
  34. echo $user->name . '<br>', $user->money . '<br>', $user->sale . '<br>';

  • 从类的外部访问不存在或者无权限属性时,会被调用

  • 属性拦截器就是借助__get()方法,拦截用户对类的内部属性访问时,动态生成访问接口

  • 可以创建一些属性方法,通过__get()是调用相关方法

__set()方法(当外部修改类中不存在或者无权限访问属性是会自动调用并处理)

  1. <?php
  2. class User
  3. {
  4. private $name;
  5. private $money;
  6. private $sale;
  7. // 构造方法
  8. public function __construct($name, $money, $sale)
  9. {
  10. $this->name = $name;
  11. $this->money = $money;
  12. $this->sale = $sale;
  13. }
  14. // __get()方法
  15. public function __set($name, $value)
  16. {
  17. // 调用统一方法
  18. return $this->setName($name, $value);
  19. }
  20. // 修改名称时也可以调用统一方法 在输出时用__get()方法过滤或者其他操作
  21. private function setName($name, $value)
  22. {
  23. return $this->$name = $value;
  24. }
  25. // __get()方法(当外部访问类中不存在或者无权限访问属性是会自动调用并处理)
  26. public function __get($name)
  27. {
  28. $method = 'get' . ucfirst($name);
  29. return method_exists($this, $method) ? $this->$method() : '无权限访问';
  30. }
  31. protected function getName()
  32. {
  33. // 可以过滤一些字符
  34. echo mb_substr($this->name, 0, 11) . '...';
  35. }
  36. protected function getMoney()
  37. {
  38. // 直接输出折后价
  39. echo '折后价' . $this->money * $this->sale;
  40. }
  41. }
  42. $user = new User('手机,iphone11,256G', 8500, 0.9);
  43. echo $user->name . ':' . $user->money . '元<hr>';
  44. $user->name = '手机,iphone12,256G';
  45. $user->money = 6000;
  46. echo $user->name . ':' . $user->money . '元';

__isset()方法(当外部检测类中不存在或者无权限访问属性是会自动调用并处理)

  1. <?php
  2. // __isset()方法检测私有成员
  3. class User
  4. {
  5. public $name;
  6. private $money;
  7. private $sale;
  8. public function __construct($name, $money)
  9. {
  10. $this->name = $name;
  11. $this->money = $money;
  12. }
  13. public function __isset($name)
  14. {
  15. var_dump(isset($this->$name));
  16. }
  17. }
  18. $user = new User('小龙虾', '38元/斤');
  19. // isset检查变量是否初始化(对于不存在或无访问权限的的属性时时没有返回值的)
  20. var_dump((isset($user->name)));
  21. echo '<hr>';
  22. var_dump((isset($user->sale)));
  23. echo '<hr>';
  24. echo (isset($user->money));

__unset()方法(当外部删除类中不存在或者无权限访问属性是会自动调用并处理)

  1. <?php
  2. // __unset()方法删除私有成员
  3. class User
  4. {
  5. public $name;
  6. private $money;
  7. private $sale;
  8. public function __construct($name, $money, $sale)
  9. {
  10. $this->name = $name;
  11. $this->money = $money;
  12. $this->sale = $sale;
  13. }
  14. public function __get($name)
  15. {
  16. return $this->$name;
  17. }
  18. public function __unset($name)
  19. {
  20. unset($this->$name);
  21. }
  22. }
  23. $user = new User('香烟', 100, '0.99');
  24. echo $user->name . '<br>', $user->money . '<br>', $user->sale . '<br>';
  25. // 删除公共成员
  26. unset($user->name);
  27. echo $user->name . '<br>', $user->money . '<br>', $user->sale . '<br>';
  28. // 删除私有成员
  29. unset($user->money);
  30. echo $user->name . '<br>', $user->money . '<br>', $user->sale . '<br>';


方法拦截器

  1. <?php
  2. class User
  3. {
  4. // (当外部调用类中不存在或者无权限访问方法时会自动调用并处理)
  5. public function __call($name, $ary)
  6. {
  7. printf("方法名:%s ,参数为:[%s]", $name, implode(',', $ary));
  8. }
  9. // 当外部调用类中不存在或者无权限访问静态方法时会自动调用并处理)
  10. public static function __callstatic($name, $ary)
  11. {
  12. printf("方法名:%s , 参数为:[%s]", $name, implode(',', $ary));
  13. }
  14. }
  15. $user = new User;
  16. $user->get(1, 2, 3);
  17. echo '<hr>';
  18. User::set(1, 2, 3);

事件委托

  1. <?php
  2. // 事件委托(跨类)
  3. class User
  4. {
  5. public function get($name, $ary)
  6. {
  7. printf("方法名:%s ,参数为:[%s]", $name, implode(',', $ary));
  8. }
  9. public static function set($name, $ary)
  10. {
  11. printf("方法名:%s , 参数为:[%s]", $name, implode(',', $ary));
  12. }
  13. }
  14. class Work
  15. {
  16. private $user;
  17. // 构造方法
  18. public function __construct($name)
  19. {
  20. $this->user = $name;
  21. }
  22. // 访问未定义的普通方法时自动调用
  23. public function __call($name, $ary)
  24. {
  25. if (method_exists($this->user, $name))
  26. return call_user_func_array([$this->user, $name], [$name, $ary]);
  27. }
  28. // 访问未定义的静态方法时自动调用
  29. public static function __callStatic($name, $ary)
  30. {
  31. if (method_exists('User', $name))
  32. return call_user_func_array(['User', $name], [$name, $ary]);
  33. }
  34. }
  35. $user = new User;
  36. $work = new Work($user);
  37. $work->get(1, 2, 3);
  38. echo '<hr>';
  39. Work::set(1, 2, 3, 4);

数据库操作

  1. <?php
  2. class Query
  3. {
  4. // 连接对象
  5. protected $db;
  6. // 数据表
  7. protected $table;
  8. // 字段列表
  9. protected $field;
  10. // 预处理字符
  11. protected $ex;
  12. // 构造方法创建数据库连接
  13. public function __construct($dsn, $username, $password)
  14. {
  15. $this->connect($dsn, $username, $password);
  16. }
  17. private function connect($dsn, $username, $password)
  18. {
  19. $this->db = new PDO($dsn, $username, $password);
  20. }
  21. // 设置默认数据表
  22. public function table($table)
  23. {
  24. $this->table = $table;
  25. return $this;
  26. }
  27. // 设置字段名称
  28. public function field($field)
  29. {
  30. $this->field = $field;
  31. return $this;
  32. }
  33. // 设置预处理字符
  34. public function ex($exe)
  35. {
  36. $this->ex = $exe;
  37. return $this;
  38. }
  39. // 生成查询语句
  40. protected function sesql()
  41. {
  42. return sprintf('SELECT %s FROM %s WHERE `id` >?', $this->field, $this->table,);
  43. }
  44. // 生成新增语句
  45. protected function insql()
  46. {
  47. return sprintf('INSERT %s SET %s=? ,%s=?, %s=?', $this->table, ...$this->field);
  48. }
  49. // 新增更新语句
  50. protected function upsql()
  51. {
  52. return sprintf("UPDATE %s SET %s=? ,%s=?, %s=? WHERE %s=?", $this->table, ...$this->field);
  53. }
  54. // 新增删除语句
  55. protected function desql()
  56. {
  57. return sprintf("DELETE FROM %s WHERE %s=?", $this->table, $this->field, $this->ex);
  58. }
  59. // 执行sql语句
  60. public function select($id)
  61. {
  62. switch ($id) {
  63. // 执行查询操作
  64. case 'se':
  65. $stmt = $this->db->prepare($this->sesql());
  66. // var_dump($stmt);
  67. // die;
  68. $stmt->execute([$this->ex]);
  69. foreach ($stmt->fetchAll() as $a) {
  70. vprintf('<li>序号:%d,姓名= %s 性别= %s</li><hr>', $a);
  71. }
  72. break;
  73. // 执行新增操作
  74. case 'in':
  75. $stmt = $this->db->prepare($this->insql());
  76. $stmt->execute(...[$this->ex]);
  77. printf('新增成功 %s 条数据<hr>', $stmt->rowCount());
  78. break;
  79. // 执行更新操作
  80. case 'up':
  81. $stmt = $this->db->prepare($this->upsql());
  82. $stmt->execute(...[$this->ex]);
  83. printf('更新成功 %s 条数据<hr>', $stmt->rowCount());
  84. break;
  85. // 执行删除操作
  86. case 'de':
  87. $stmt = $this->db->prepare($this->desql());
  88. $stmt->execute([$this->ex]);
  89. printf('删除成功 %s 条数据<hr>', $stmt->rowCount());
  90. break;
  91. default:
  92. echo '请求失败';
  93. }
  94. }
  95. }
  96. class DB
  97. {
  98. public static function __callStatic($name, $ary)
  99. {
  100. $dsn = 'mysql:host=localhost;dbname=user';
  101. $username = 'root';
  102. $password = 'root';
  103. $query = new Query($dsn, $username, $password);
  104. return call_user_func([$query, $name], ...$ary);
  105. }
  106. }
  107. // 新增操作
  108. DB::table('apple')->field(['username', 'password', 'sex'])->ex(['野猪套', sha1(333), '男'])->select('in');
  109. // 更新操作
  110. DB::table('apple')->field(['username', 'password', 'sex', 'id'])->ex(['黄金石像', sha1(444), '男', 45])->select('up');
  111. // 删除操作
  112. DB::table('apple')->field('id')->ex(2)->select('de');
  113. // 查询操作
  114. DB::table('apple')->field('id, username, sex')->ex(30)->select('se');

总结

1.了解了拦截器的应用场景
2.对于事件委托有了一定的认识

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议