博客列表 >方法拦截器的__isset()、 __unset()及构造器中的数据库操作

方法拦截器的__isset()、 __unset()及构造器中的数据库操作

零龙
零龙原创
2020年08月07日 06:39:58649浏览

isset和unset的使用

__isset:判断属性是否存在或者为空会自动触发

__isset()是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。
如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以在对象的外部使用isset()函数来测定私有成员属性是否被设定了呢?当然是可以的,但不是一成不变。
你只要在类里面加上一个isset()方法就可以了,当在类外部使用isset()函数来测定对象里面的私有成员是否被设定时,就会自动调用类里面的isset()方法了帮我们完成这样的操作。

__unset:当对不可访问属性调用unset()时被调用

unset()这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。
1、 如果一个对象里面的成员属性是公有的,就可以使用这个函数在对象外面删除对象的公有属性。
2、 如果对象的成员属性是私有的,我使用这个函数就没有权限去删除。
虽然有以上两种情况,但我想说的是同样如果你在一个对象里面加上unset()这个方法,就可以在对象的外部去删除对象的私有成员属性了。
在对象里面加上了unset()这个方法之后,在对象外部使用“unset()”函数删除对象内部的私有成员属性时,对象会自动调用unset()函数来帮我们删除对象内部的私有成员属性。

示例:

  1. class people
  2. {
  3. public $username;
  4. private $age;
  5. public function __construct($username,$age)
  6. {
  7. $this->username = $username;
  8. $this->age = $age;
  9. }
  10. //外部判断私有属性是否存在使用__isset自动执行
  11. //public公用属性不通过__isset来执行
  12. public function __isset($value)
  13. {
  14. //外部调用isset,公用属性public返回false不被执行
  15. //私有属性private 返回true,可以对私有属性进行操作
  16. echo isset($this->$value);
  17. }
  18. //外部使用__unset用来删除指定的变量。
  19. //私有属性自动触发__unset进行操作
  20. public function __unset($value)
  21. {
  22. echo isset($this->$value);
  23. }
  24. }
  25. $people = new people('曹操',39);
  26. var_dump(isset($people->$username));
  27. echo "<hr>";
  28. var_dump(isset($people->age));
  29. echo "<hr>";
  30. unset($people->$username);
  31. echo "<hr>";
  32. unset($people->age);

示例图:

总结:对isset的使用中可以直接处理掉公用属性,可以对私有属性赋值或者删除。同样unset也可以进行相同操作

构造器中对数据库增删改查

示例:

  1. <?php
  2. //方法委托实战:数据库查询构造器(链式查询)
  3. class Query
  4. {
  5. // 连接对象
  6. protected $db;
  7. // 数据表
  8. protected $table;
  9. // 字段列表
  10. protected $field;
  11. // 记录数量
  12. protected $limit;
  13. //对数据赋值处理
  14. public $updates;
  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 condition($condition)
  45. {
  46. $this->condition = $condition;
  47. return $this;
  48. }
  49. //设置内容
  50. public function content($content)
  51. {
  52. $this->content = $content;
  53. return $this;
  54. }
  55. //对数据库的增和改对数据表和值进行赋值处理
  56. private function updates()
  57. {
  58. $field = $this->field;
  59. $content = $this->content;
  60. $values = array_combine($field,$content);
  61. foreach ($values as $key =>$value)
  62. {
  63. $upd[] = "{$key}='{$value}'";
  64. }
  65. return join(",",$upd);
  66. }
  67. public function getSql($value)
  68. {
  69. switch ($value)
  70. {
  71. case 'select':
  72. return sprintf('SELECT %s FROM %s LIMIT %s', $this->field, $this->table, $this->limit);
  73. break;
  74. case 'update':
  75. $this->updates = $this->updates(); //将数据赋值处理
  76. return sprintf('UPDATE %s SET %s WHERE %s',$this->table, $this->updates, $this->condition);
  77. break;
  78. case 'insert':
  79. $this->updates = $this->updates(); //将数据赋值处理
  80. return sprintf('INSERT %s SET %s', $this->table,$this->updates);
  81. break;
  82. case 'delete':
  83. return sprintf('DELETE FROM %s WHERE %s',$this->table,$this->condition);
  84. break;
  85. default :
  86. return '没有查询到的数据!';
  87. }
  88. }
  89. // 执行查询
  90. public function select()
  91. {
  92. return $this->db->query($this->getSql('select'))->fetchAll(PDO::FETCH_ASSOC);
  93. }
  94. // 执行更新
  95. public function update()
  96. {
  97. return $this->db->query($this->getSql('update'));
  98. }
  99. // 执行增加
  100. public function insert()
  101. {
  102. return $this->db->query($this->getSql('insert'));
  103. }
  104. //执行删除
  105. public function delete()
  106. {
  107. return $this->db->query($this->getSql('delete'));
  108. }
  109. }
  110. class DB
  111. {
  112. public static function __callStatic($name, $args)
  113. {
  114. //获取查询类的对象: new Query()
  115. $dsn = 'mysql:host=localhost;dbname=mysqli';
  116. $username = 'root';
  117. $password = '142536';
  118. $query = new Query($dsn,$username,$password);
  119. return call_user_func([$query,$name],...$args);
  120. }
  121. }
  122. $result = DB::table('user')
  123. ->field(['username','password','sex','age','email','mobile'])
  124. ->content(['天蓬',sha1('142536'),'男','38','tp@126.com','16612344321'])
  125. ->insert();
  126. //使用数组赋值
  127. echo $result ? '添加成功' :'添加失败';
  128. echo "<hr>";
  129. $result =DB::table('user')
  130. ->field('username')
  131. ->limit(10)
  132. ->select();
  133. print_r($result); //输出查询
  134. echo "<hr>";
  135. $result = DB::table('user')
  136. ->field(['username','password','sex','age','email','mobile'])
  137. ->content(['啸天',sha1('142536'),'男','29','xtq@qq.com','1555551234'])
  138. ->condition("username = '嫦娥'")
  139. ->update();
  140. //使用数组赋值
  141. echo $result ? '更新成功' :'更新失败';
  142. echo "<hr>";
  143. $result = DB::table('user')
  144. ->condition('Id > 335')
  145. ->delete();
  146. print_r($result);
  147. echo $result ? '删除成功' :'删除失败';

示例图:

总结:案例中使用了array_combine对数据进行赋值后传入SQL执行。改写了输入字符串为数组。对类的构造方法又进一步学习。重点在return $this、对多个方法串联到一起。

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