Blogger Information
Blog 15
fans 0
comment 0
visits 11168
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
__isset()和__unset()访问拦截、数据库操作、__sleep()与__wakeup
乐作人生
Original
620 people have browsed it
  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'));

Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:咱们周未班还在坚持写作业的同学, 不多了, 希望你走到最后
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post