设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间20 现在时间20 缓存数据 你在睡觉,你若想起,你会微笑。

你在睡觉,你若想起,你会微笑。

查看: 1089|回复: 0

php反序列化之魔术方法超详细讲解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:24
  • 打卡月天数:0
  • 打卡总奖励:295
  • 最近打卡:2025-06-29 09:35:10
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
375
主题
347
精华
0
金钱
1408
积分
774
注册时间
2023-2-10
最后登录
2025-6-29

发表于 2023-2-12 09:55:27 | 显示全部楼层 |阅读模式
php魔术方法

在php类保留方法中以 “__”两个下划线开头的函数称为魔术方法,我的理解为php类设计中自定义好的函数。
常见的魔术方法有:
  1. __construct(),类的构造函数__destruct(),类的析构函数__call(),在对象中调用一个不可访问方法时调用__callStatic(),用静态方式中调用一个不可访问方法时调用__get(),获得一个类的成员变量时调用__set(),设置一个类的成员变量时调用__isset(),当对不可访问属性调用isset()或empty()时调用__unset(),当对不可访问属性调用unset()时被调用__sleep(),执行serialize()时,先会调用这个函数__wakeup(),执行unserialize()时,先会调用这个函数__toString(),类被当成字符串时的回应方法__invoke(),调用函数的方式调用一个对象时的回应方法__set_state(),调用var_export()导出类时,此静态方法会被调用__clone(),当对象复制完成时调用__autoload(),尝试加载未定义的类__debugInfo(),打印所需调试信息
复制代码
__construct()与__destruct()

__construct() 构造函数与 __destruct() 析构函数,与其他的语言如java,c#,一样,构造函数就是在对象实例化的时候先执行初始化的方法。
__construct()构造函数只有在new 一个对象的时候会触发,在serialize 序列化和unserialize反序列化中都不会触发
  1. <?php
  2. class demo1{
  3.     private $k1;
  4.     public function __construct()
  5.     {
  6.         echo("构造函数被调用"."<br>");
  7.     }
  8.     public  function f1(){
  9.         echo("f1 函数被调用");
  10.     }
  11. }
  12. echo("0000"."<br>");
  13. $f=new demo1();
  14. echo("1111"."<br>");
  15. $a=serialize($f);
  16. echo("2222"."<br>");
  17. unserialize($a);
  18. ?>
复制代码
输出结果
105640cjpbb1zpibjzd7xq.png

__destruct() 析构函数则在对象销毁和serialize 反序列化的情况下会被触发。如下
  1. <?php
  2. class demo1{
  3.     private $k1;
  4.     public function __destruct()
  5.     {
  6.         echo("析构函数被调用"."<br>");
  7.     }
  8. }
  9. $f=new demo1();
  10. echo("0000"."<br>");
  11. $a=serialize($f);
  12. echo("1111"."<br>");
  13. unset($f);
  14. echo("2222"."<br>");
  15. unserialize($a);
  16. ?>
复制代码
输出结果
105640lvzckzltcvrchcct.png


__call

__call 魔术方法的作用是当前对象调用一个不存在的方法时,就会被触发
  1. <?php
  2. class demo1{
  3.     private $k1;
  4.     public  function f1(){
  5.         echo("f1 函数被调用");
  6.     }
  7.           //当调用不存在的方法时,方法名作为参数传到$name 变量,方法名的输入参数传到arguments参数列表中
  8.     public function __call($name, $arguments)
  9.     {
  10.         // TODO: Implement __call() method.
  11.         echo($name."---".$arguments[0]);
  12.     }
  13. }
  14. $f=new demo1();
  15. $f->f2("123");//调用不存在的方法f2()
  16. ?>
复制代码
输出结果
105640bvntznguznu7p7mv.png


__get

__get() 魔术方法是当访问一个对象不存在的变量时就会被触发
  1. <?php
  2. class demo1{
  3.     private $k1;
  4.     public  function f1(){
  5.         echo("f1 函数被调用");
  6.     }
  7.     public function __get($name)//不存在的变量k会以参数传到$name
  8.     {
  9.         echo($name);
  10.     }
  11. }
  12. $f=new demo1();
  13. $f->k;//不存在的变量k
  14. ?>
复制代码
输出结果
105640l59abwfdisasycvv.png


__set

__set() 魔术方法是当给一个对象不存在的变量赋值时就会被触发
  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. highlight_file(__FILE__);
  4. class demo1{
  5.     private $k1;
  6.     public  function f1(){
  7.         echo("f1 函数被调用");
  8.     }
  9.     public function __set($name, $value)
  10.     {
  11.         echo($name."---".$value);
  12.     }
  13. }
  14. $f=new demo1();
  15. $f->k=123; //给不存在的成员变量赋值
  16. ?>
复制代码
输出结果
105640v34o5z534u7nk58p.png


__isset

当对不可访问属性调用isset()或empty()时会触发,例如访问类的私有属性,类不存在的成员属性
  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. highlight_file(__FILE__);
  4. class demo1{
  5.     private $k1;
  6.     public  function f1(){
  7.         echo("f1 函数被调用");
  8.     }
  9.     public function __isset($name)
  10.     {
  11.        echo($name);
  12.     }
  13. }
  14. $f=new demo1();
  15. $f2=unserialize(serialize($f));//反序列化
  16. isset($f2->k1);//使用isset方法判断私有成员属性k1
  17. empty($f2->k1);//使用empty方法判断私有成员属性k1
  18. ?>
复制代码
输出结果
105641gy6lssjljsmss6yj.png


__unset

当尝试使用unset() 销毁函数去销毁一个不可访问的成员属性时会触发,不可访问(包括私有成员属性,不存在的成员属性)
  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. highlight_file(__FILE__);
  4. class demo1{
  5.     private $k1;
  6.     public  function f1(){
  7.         echo("f1 函数被调用");
  8.     }
  9.     public function __unset($name)
  10.     {
  11.         echo($name);
  12.     }
  13. }
  14. $f=new demo1();
  15. $f2=unserialize(serialize($f));//反序列化
  16. unset($f2->k1);//使用unset销毁私有成员属性k1
  17. unset($f2->faaa);//使用unset销毁不存在的成员属性faaa
  18. ?>
复制代码
输出结果
105641srvrqrssrryqrxr2.png


__sleep

当对象被serialize 序列化时触发调用__sleep
  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. highlight_file(__FILE__);
  4. class demo1{
  5.     private $k1;
  6.     public  function f1(){
  7.         echo("f1 函数被调用");
  8.     }
  9.     public function __sleep()
  10.     {
  11.         echo("在被序列化时被调用");
  12.     }
  13. }
  14. $f=new demo1();
  15. echo("00000"."</br>");
  16. serialize($f);
  17. ?>
复制代码
输出结果
105641sl3d035zfx9ahvlp.png


__wakeup

当进行unserialize 反序列化对象时,__wakeup魔术方法会被触发,看起来__wakeup与__sleep 触发条件是相反的
  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. highlight_file(__FILE__);
  4. class demo1{
  5.     private $k1;
  6.     public  function f1(){
  7.         echo("f1 函数被调用");
  8.     }
  9.     public function __wakeup()
  10.     {
  11.         echo("在被反序列化时被调用");
  12.     }
  13. }
  14. $f=new demo1();
  15. $uz=serialize($f);
  16. echo("00000"."</br>");
  17. unserialize($uz);
  18. ?>
复制代码
输出结果
105641vnd0q0t9h69fduni.png


__toString

如果一个对象类中存在__toString魔术方法,这个对象类被当做字符串进行处理时,就会触发__toString魔术方法,而不会产生错误
  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. highlight_file(__FILE__);
  4. class demo1{
  5.     private $k1;
  6.     public  function f1(){
  7.         echo("f1 函数被调用");
  8.     }
  9.     public function __toString()
  10.     {
  11.         echo("__toString 被触发了");
  12.         return "";
  13.     }
  14. }
  15. $f=new demo1();
  16. echo($f);
  17. ?>
复制代码
输出结果
105642zfm59jymmm45z9qs.png


__invoke

当一个对象类中存在__invoke魔术方法,这个对象类被当作函数进行调用时,就会触发__invoke魔术方法,而不会产生错误
  1. <?php
  2. header("Content-Type:text/html;charset=utf-8");
  3. highlight_file(__FILE__);
  4. class demo1{
  5.     private $k1;
  6.     public  function f1(){
  7.         echo("f1 函数被调用");
  8.     }
  9.     public function __invoke()
  10.     {
  11.        echo("__invoke 被触发了");
  12.     }
  13. }
  14. $f=new demo1();
  15. $f();
  16. ?>
复制代码
输出结果
105642p49226969j4uc6iu.png

到此这篇关于php反序列化之魔术方法超详细讲解的文章就介绍到这了,更多相关php反序列化 内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表