欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php反序列化之魔術(shù)方法超詳細講解

 更新時間:2022年11月02日 17:03:13   作者:隱形卟  
序列化其實就是將數(shù)據(jù)轉(zhuǎn)化成一種可逆的數(shù)據(jù)結(jié)構(gòu),自然,逆向的過程就叫做反序列化。php將數(shù)據(jù)序列化和反序列化會用到兩個函數(shù):serialize 將對象格式化成有序的字符串、unserialize 將字符串還原成原來的對象

php魔術(shù)方法

在php類保留方法中以 “__”兩個下劃線開頭的函數(shù)稱為魔術(shù)方法,我的理解為php類設(shè)計中自定義好的函數(shù)。

常見的魔術(shù)方法有:

__construct(),類的構(gòu)造函數(shù)
__destruct(),類的析構(gòu)函數(shù)
__call(),在對象中調(diào)用一個不可訪問方法時調(diào)用
__callStatic(),用靜態(tài)方式中調(diào)用一個不可訪問方法時調(diào)用
__get(),獲得一個類的成員變量時調(diào)用
__set(),設(shè)置一個類的成員變量時調(diào)用
__isset(),當(dāng)對不可訪問屬性調(diào)用isset()或empty()時調(diào)用
__unset(),當(dāng)對不可訪問屬性調(diào)用unset()時被調(diào)用
__sleep(),執(zhí)行serialize()時,先會調(diào)用這個函數(shù)
__wakeup(),執(zhí)行unserialize()時,先會調(diào)用這個函數(shù)
__toString(),類被當(dāng)成字符串時的回應(yīng)方法
__invoke(),調(diào)用函數(shù)的方式調(diào)用一個對象時的回應(yīng)方法
__set_state(),調(diào)用var_export()導(dǎo)出類時,此靜態(tài)方法會被調(diào)用
__clone(),當(dāng)對象復(fù)制完成時調(diào)用
__autoload(),嘗試加載未定義的類
__debugInfo(),打印所需調(diào)試信息

__construct()與__destruct()

__construct() 構(gòu)造函數(shù)與 __destruct() 析構(gòu)函數(shù),與其他的語言如java,c#,一樣,構(gòu)造函數(shù)就是在對象實例化的時候先執(zhí)行初始化的方法。

__construct()構(gòu)造函數(shù)只有在new 一個對象的時候會觸發(fā),在serialize 序列化和unserialize反序列化中都不會觸發(fā)

<?php
class demo1{
    private $k1;
    public function __construct()
    {
        echo("構(gòu)造函數(shù)被調(diào)用"."<br>");
    }
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
}
echo("0000"."<br>");
$f=new demo1();
echo("1111"."<br>");
$a=serialize($f);
echo("2222"."<br>");
unserialize($a);
?>

輸出結(jié)果

__destruct() 析構(gòu)函數(shù)則在對象銷毀和serialize 反序列化的情況下會被觸發(fā)。如下

<?php
class demo1{
    private $k1;
    public function __destruct()
    {
        echo("析構(gòu)函數(shù)被調(diào)用"."<br>");
    }
}
$f=new demo1();
echo("0000"."<br>");
$a=serialize($f);
echo("1111"."<br>");
unset($f);
echo("2222"."<br>");
unserialize($a);
?>

輸出結(jié)果

__call

__call 魔術(shù)方法的作用是當(dāng)前對象調(diào)用一個不存在的方法時,就會被觸發(fā)

<?php
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
	  //當(dāng)調(diào)用不存在的方法時,方法名作為參數(shù)傳到$name 變量,方法名的輸入?yún)?shù)傳到arguments參數(shù)列表中
    public function __call($name, $arguments)
    {
        // TODO: Implement __call() method.
        echo($name."---".$arguments[0]);
    }
}
$f=new demo1();
$f->f2("123");//調(diào)用不存在的方法f2()
?>

輸出結(jié)果

__get

__get() 魔術(shù)方法是當(dāng)訪問一個對象不存在的變量時就會被觸發(fā)

<?php
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __get($name)//不存在的變量k會以參數(shù)傳到$name
    {
        echo($name);
    }
}
$f=new demo1();
$f->k;//不存在的變量k
?>

輸出結(jié)果

__set

__set() 魔術(shù)方法是當(dāng)給一個對象不存在的變量賦值時就會被觸發(fā)

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __set($name, $value)
    {
        echo($name."---".$value);
    }
}
$f=new demo1();
$f->k=123; //給不存在的成員變量賦值
?>

輸出結(jié)果

__isset

當(dāng)對不可訪問屬性調(diào)用isset()或empty()時會觸發(fā),例如訪問類的私有屬性,類不存在的成員屬性

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __isset($name)
    {
       echo($name);
    }
}
$f=new demo1();
$f2=unserialize(serialize($f));//反序列化
isset($f2->k1);//使用isset方法判斷私有成員屬性k1
empty($f2->k1);//使用empty方法判斷私有成員屬性k1
?>

輸出結(jié)果

__unset

當(dāng)嘗試使用unset() 銷毀函數(shù)去銷毀一個不可訪問的成員屬性時會觸發(fā),不可訪問(包括私有成員屬性,不存在的成員屬性)

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __unset($name)
    {
        echo($name);
    }
}
$f=new demo1();
$f2=unserialize(serialize($f));//反序列化
unset($f2->k1);//使用unset銷毀私有成員屬性k1
unset($f2->faaa);//使用unset銷毀不存在的成員屬性faaa
?>

輸出結(jié)果

__sleep

當(dāng)對象被serialize 序列化時觸發(fā)調(diào)用__sleep

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __sleep()
    {
        echo("在被序列化時被調(diào)用");
    }
}
$f=new demo1();
echo("00000"."</br>");
serialize($f);
?>

輸出結(jié)果

__wakeup

當(dāng)進行unserialize 反序列化對象時,__wakeup魔術(shù)方法會被觸發(fā),看起來__wakeup與__sleep 觸發(fā)條件是相反的

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __wakeup()
    {
        echo("在被反序列化時被調(diào)用");
    }
}
$f=new demo1();
$uz=serialize($f);
echo("00000"."</br>");
unserialize($uz);
?>

輸出結(jié)果

__toString

如果一個對象類中存在__toString魔術(shù)方法,這個對象類被當(dāng)做字符串進行處理時,就會觸發(fā)__toString魔術(shù)方法,而不會產(chǎn)生錯誤

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __toString()
    {
        echo("__toString 被觸發(fā)了");
        return "";
    }
}
$f=new demo1();
echo($f);
?>

輸出結(jié)果

__invoke

當(dāng)一個對象類中存在__invoke魔術(shù)方法,這個對象類被當(dāng)作函數(shù)進行調(diào)用時,就會觸發(fā)__invoke魔術(shù)方法,而不會產(chǎn)生錯誤

<?php
header("Content-Type:text/html;charset=utf-8");
highlight_file(__FILE__);
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
    public function __invoke()
    {
       echo("__invoke 被觸發(fā)了");
    }
}
$f=new demo1();
$f();
?>

輸出結(jié)果

到此這篇關(guān)于php反序列化之魔術(shù)方法超詳細講解的文章就介紹到這了,更多相關(guān)php反序列化 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • php SQL Injection with MySQL

    php SQL Injection with MySQL

    本文僅用于教學(xué)目的,如果因為本文造成的攻擊后果本人概不負責(zé),本文所有代碼均為本人所寫,所有數(shù)據(jù)均經(jīng)過測試。絕對真實。
    2011-02-02
  • PHP中Array相關(guān)函數(shù)簡介

    PHP中Array相關(guān)函數(shù)簡介

    在php教程中數(shù)組是種強大的數(shù)據(jù)類型,他可以做的事情很多,可以存儲不同的數(shù)據(jù)類型在一個數(shù)組中,下面我們列出了數(shù)組常用的操作,排序,鍵名對數(shù)組排序等做法。
    2016-07-07
  • 解析如何用php screw加密php源代碼

    解析如何用php screw加密php源代碼

    本篇文章是對用php_screw加密php源代碼進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • php獲取本機真實IP地址實例代碼

    php獲取本機真實IP地址實例代碼

    這篇文章主要為大家詳細介紹了php獲取本機真實IP地址實例代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • php實現(xiàn)比較兩個字符串日期大小的方法

    php實現(xiàn)比較兩個字符串日期大小的方法

    這篇文章主要介紹了php實現(xiàn)比較兩個字符串日期大小的方法,涉及php日期操作的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • PHP autoload使用方法及步驟詳解

    PHP autoload使用方法及步驟詳解

    這篇文章主要介紹了PHP autoload使用方法及步驟詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • php5數(shù)字型字符串加解密代碼

    php5數(shù)字型字符串加解密代碼

    對應(yīng)awk版加解密程序的PHP實現(xiàn)代碼
    2008-04-04
  • php多數(shù)據(jù)庫支持的應(yīng)用程序設(shè)計

    php多數(shù)據(jù)庫支持的應(yīng)用程序設(shè)計

    以前做PHP應(yīng)用,多數(shù)是單數(shù)據(jù)庫數(shù)據(jù)查詢和更新,頂多也是主從數(shù)據(jù)庫的支持,實現(xiàn)起來相對簡單。主從數(shù)據(jù)庫的問題在于,當(dāng)會話存儲在數(shù)據(jù)庫的時候,同步將可能出現(xiàn)問題,也就是說有可能出現(xiàn)會話的中斷。
    2008-08-08
  • golang、python、php、c++、c、java、Nodejs性能對比

    golang、python、php、c++、c、java、Nodejs性能對比

    這篇文章主要介紹了golang、python、php、c++、c、java、Nodejs性能對比的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • PHP中常見的緩存技術(shù)實例分析

    PHP中常見的緩存技術(shù)實例分析

    這篇文章主要介紹了PHP中常見的緩存技術(shù),以實例形式較為詳細的分析了php中緩存技術(shù)的原理、特點及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09

最新評論