博客列表 >__isset()和__unset()访问拦截、数据库操作、__sleep()与__wakeup

__isset()和__unset()访问拦截、数据库操作、__sleep()与__wakeup

乐作人生
乐作人生原创
2020年10月10日 17:49:01622浏览
  1. 实现isset()和unset()访问拦截操作

    1. //重载:属性访问拦截器
    2. // __isset(), __unset()对不可访问的属性进行调用
    3. // isset() 函数用于检测变量是否已设置并且非 NULL
    4. // unset()删除指定的变量且传回true,参数为要删除的变量
    5. class User{
    6. public $name;
    7. private $age;
    8. public function __construct($name,$age){
    9. $this->name=$name;
    10. $this->age=$age;
    11. }
    12. // 在外部对一个不可访问的属性使用isset()函数时,调用__isset()方法,在类内部检测成员是否存在
    13. public function __isset($value){
    14. return isset($this->$value);
    15. }
    16. // __unset()对一个不可访问的属性进行调用unset()时自动调用
    17. public function __unset($value){
    18. unset($this->$value);
    19. }
    20. }
    21. $user=new User('张三','21');
    22. // $name为公开成员可以直接使用isset函数
    23. var_dump(isset($user->name));
    24. echo '<br>';
    25. var_dump(isset($user->age));
    26. echo '<hr>';
    27. print_r($user);//打印$user对象
    28. echo '<br>';
    29. //类中的公开属性成员可以直接被删除
    30. unset($user->name);
    31. print_r($user);
    32. echo '<br>';
    33. // unset()删除非公开成员,调用类中的__unset方法
    34. unset($user->age);
    35. print_r($user);

  2. 事件委托:insert(), update(), delete()方法

    1. //查询类
    2. class Query{
    3. protected $db; // 连接对象
    4. protected $table; // 数据表
    5. protected $field; // 字段列表
    6. protected $where; // 条件
    7. protected $limit; // 记录数量
    8. // 构造方法:连接数据库
    9. public function __construct($dsn,$username,$password){
    10. $this->connect($dsn,$username,$password);
    11. }
    12. // 数据库连接
    13. public function connect($dsn,$username,$password){
    14. $this->db=new PDO($dsn,$username,$password);
    15. }
    16. // 设置数据表表名
    17. public function table($table){
    18. $this->table=$table;
    19. return $this; // 返回当前类的实例,方便链式调用后面的方法,必须加上
    20. }
    21. // 设置字段列表
    22. public function field($field){
    23. $this->field=$field;
    24. return $this;
    25. }
    26. // 设置条件
    27. public function where($id='id',$key=0,$b='='){
    28. $this->where=$id.$b.'\''.$key.'\'';;
    29. return $this;
    30. }
    31. // 设置返回的记录数量
    32. public function limit($limit){
    33. $this->limit=$limit;
    34. return $this;
    35. }
    36. // 生成sql语句
    37. public function getSql($value,$m='',$n=''){
    38. switch($value){
    39. case 'select'://查询:SELECT 字段列表 FROM 表名 WHERE 条件 LIMIT 数量;
    40. $sql=sprintf('SELECT %s FROM %s LIMIT %d',$this->field,$this->table,$this->limit);
    41. break;
    42. case 'insert'://插入:INSERT 表名 SET 字段列表;INSERT INTO 表名 (字段列表) VALUES (字段列表对应的值)
    43. // $sql=sprintf('INSERT %s SET %s',$this->table,$this->field);
    44. $sql=sprintf('INSERT INTO %s (%s) VALUES (%s)',$this->table,$m,$n);
    45. break;
    46. case 'update'://更新:UPDATE 表名 SET 字段列表 WHERE 条件;
    47. $sql=sprintf('UPDATE %s SET %s WHERE %s',$this->table,$m,$this->where);
    48. break;
    49. case 'delete'://删除:DELETE FROM 表名 WHERE 条件;
    50. $sql=sprintf('DELETE FROM %s WHERE %s',$this->table,$this->where);
    51. break;
    52. }
    53. return $sql;
    54. }
    55. // 执行查询操作
    56. public function select(){
    57. return $this->db->query($this->getSql('select'))->fetchAll(PDO::FETCH_ASSOC);
    58. }
    59. // 执行插入操作
    60. public function insert($inserts=[]){
    61. // 将数组中的键值调取出作为SQL的字段列表名
    62. $m1='`'.implode('`,`',array_keys($inserts)).'`';
    63. // 将数组中的值作为SQL中的字段列表名对应的值
    64. $n1='\''. implode('\',\'',$inserts) . '\'';
    65. return $this->db->exec($this->getSql('insert',$m1,$n1));
    66. }
    67. // 执行更新操作
    68. public function update($args=[]){
    69. $string='';
    70. foreach($args as $key=>$v){
    71. // 将需要更新的数组中的数据拼接成字符串
    72. $string.= $key.'=\''.$v.'\',';
    73. }
    74. // echo $string;
    75. return $this->db->exec($this->getSql('update',rtrim($string,',')));// rtrim()移除字符串右侧的空白字符或其他预定义字符
    76. }
    77. // 执行删除操作
    78. public function delete(){
    79. return $this->db->query($this->getSql('delete'));
    80. }
    81. }
    82. // 数据库操作
    83. class DB{
    84. // 静态方法拦截
    85. public static function __callStatic($name,$args){
    86. $dsn = 'mysql:host=localhost;dbname=phpedu';
    87. $username='root';
    88. $password='root';
    89. $query = new Query($dsn, $username, $password);
    90. return call_user_func_array([$query,$name],$args);
    91. }
    92. }
    93. // 数据输出:查询操作
    94. $users=DB::table('user')->field('id,name,email')->limit(5)->select();
    95. foreach ($users as $user) {
    96. printf('<li>%s</li>',implode(',', $user));
    97. }
    98. echo '<hr>';
    99. // 数据输出:插入操作
    100. $user=DB::table('user')->insert(['name'=>'依依','email'=>'12345@qq.com','password'=>sha1('229988')]);
    101. echo $user ?'插入成功':'插入失败';
    102. echo '<hr>';
    103. // 数据输出:更新操作
    104. $user=DB::table('user')->where('id','14')->update(['name'=>'张龙4','email'=>'zhanglong4@qq.com','password'=>sha1('2249988')]);
    105. print_r($user);
    106. echo '<hr>';
    107. // 数据输出:删除操作
    108. $user=DB::table('user')->where('id','15')->delete();
    109. print_r($user);
    110. echo $user ?'删除成功':'删除失败';
    111. echo '<hr>';

  3. sleep()与wakeup()

    1. // 序列化__sleep(), 反序列化__wakeup()
    2. class Connection{
    3. private $params=[]; // 连接参数
    4. private $link=null; // 连接对象
    5. // 构造方法 初始化操作
    6. public function __construct($dsn,$username,$password){
    7. $this->params['dsn']=$dsn;
    8. $this->params['username']=$username;
    9. $this->params['password']=$password;
    10. $this->connect();
    11. }
    12. // 连接方法
    13. public function connect(){
    14. // 实例化
    15. $this->link=new PDO(...array_values($this->params));// array_values() 函数返回包含数组中所有的值的数组
    16. }
    17. // 对象被序列化时进行调用,获取连接参数,返回的是一个数组
    18. public function __sleep(){
    19. return ['params'];
    20. }
    21. // 对象被反序列化时,要求自动连接数据库
    22. public function __wakeup(){
    23. $this->connect();
    24. }
    25. // 查询操作
    26. public function select($sql){
    27. return $this->link->query($sql)->fetchAll(PDO::FETCH_ASSOC);
    28. }
    29. }
    30. // 将参数进行赋值并实例化
    31. $dsn = 'mysql:host=localhost;dbname=phpedu';
    32. $username='root';
    33. $password='root';
    34. $db = new Connection($dsn, $username, $password);
    35. // 序列化后是一个字符串
    36. $str = serialize($db);
    37. echo $str .'<hr>';
    38. // 反序列化后是一个对象
    39. $link=unserialize($str);
    40. print_r($db->select('select * from user limit 5'));

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