博客列表 >PHP基础知识:序列化和反序列化以及魔术方法等

PHP基础知识:序列化和反序列化以及魔术方法等

李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰
李东亚¹⁸⁰³⁹⁵⁴⁰¹²⁰原创
2020年05月07日 22:31:141033浏览

序列化和克隆

1、代码练习

  1. <?php
  2. namespace T1;
  3. class A
  4. {
  5. public $name='ldy';
  6. protected $age=30;
  7. private $sex='man';
  8. public function getname(){
  9. echo $this->name;
  10. }
  11. }
  12. $a=new A();
  13. echo "<h5>序列化对象</h5>",'<br>';
  14. $s=serialize($a);
  15. echo $s;
  16. echo "<h5>反序列化对象</h5>",'<br>';
  17. $A=unserialize($s);
  18. var_dump($A);echo'<br>';
  19. echo '反序列化后获取类名:'.get_class($A),'<br>';
  20. echo '<hr>';
  21. namespace T2;
  22. echo '<h3>自定义序列化和反序列</h3>';
  23. class A
  24. {
  25. public $name='ldy';
  26. protected $age=30;
  27. private $sex='man';
  28. public function getname(){
  29. echo $this->name;
  30. }
  31. public function __sleep(){
  32. //序列化时执行,序列化对象属性
  33. return ['name','sex'];
  34. }
  35. public function __wakeup()
  36. { //反序列化时执行
  37. return $this->getname();
  38. }
  39. }
  40. $a=new A();
  41. echo "<h5>序列化对象</h5>",'<br>';
  42. $s=serialize($a);//序列化时,
  43. echo $s;
  44. echo "<h5>反序列化对象</h5>",'<br>';
  45. $A=unserialize($s);//反序列化类自动执行__wakeup(){};
  46. echo '<br>';
  47. var_dump($A);echo'<br>';
  48. echo '<hr>',"<h5>对象复制=和clone</h5>",'<br>';
  49. $name=new A();
  50. $c=$name;//引用又称别名
  51. $c->name='dacheng';
  52. echo '$c中name的值:'.$c->name,'<br>';
  53. echo '$name中name的值:'.$name->name,'<br>';
  54. $name=new A();
  55. $c=clone $name;//克隆一个新的类实例
  56. $c->name='dacheng';
  57. echo '$c中name的值:'.$c->name,'<br>';
  58. echo '$name中name的值'.$name->name,'<br>';

2、演示结果

魔术方法__toString():自定义登陆异常类

1、代码

  1. <?php
  2. class MyException extends Exception
  3. {
  4. public function __construct($message,$code){
  5. $this->message=$message;
  6. $this->code=$code;
  7. }
  8. public function __toString(){
  9. $str="异常错误提示:{$this->message}".'<br>'."异常提示代码:{$this->code}";
  10. return $str;
  11. }
  12. }
  13. class Login
  14. {
  15. public static $code;
  16. public function __construct($code){
  17. self::$code=$code;
  18. switch(self::$code){
  19. case 1:
  20. throw new MyException('密码错误',1);
  21. break;
  22. case 2:
  23. throw new MyException('账户错误',2);
  24. break;
  25. default:
  26. throw new MyException('未知异常',3);
  27. }
  28. }
  29. }
  30. try{
  31. $error=new Login(2);
  32. }catch(MyException $e){
  33. echo $e;
  34. }

2、运行结果

总结

1、序列化:serialize();对象序列化对应的函数:__sleep(){}
2、发序列化:unserialize();对象反序列化(是生成一个新对象)的对应的函数:__wakeup(){}
3、对象的复制:clone关键字,对应的对象函数__clone(){};
=把对象赋值给一个变量,是引用,就是别名
4、__toString(){}魔术方法:在直接输出对象时,自动调用
5、匿名类:new class{}:在接口实现部分功能和作为函数参数时使用

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