最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

php魔術(shù)方法

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

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

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

__construct()與__destruct()

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

__construct()構(gòu)造函數(shù)只有在new 一個(gè)對象的時(shí)候會觸發(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)用一個(gè)不存在的方法時(shí),就會被觸發(fā)

<?php
class demo1{
    private $k1;
    public  function f1(){
        echo("f1 函數(shù)被調(diào)用");
    }
	  //當(dāng)調(diào)用不存在的方法時(shí),方法名作為參數(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)訪問一個(gè)對象不存在的變量時(shí)就會被觸發(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)給一個(gè)對象不存在的變量賦值時(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 __set($name, $value)
    {
        echo($name."---".$value);
    }
}
$f=new demo1();
$f->k=123; //給不存在的成員變量賦值
?>

輸出結(jié)果

__isset

當(dāng)對不可訪問屬性調(diào)用isset()或empty()時(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 __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ù)去銷毀一個(gè)不可訪問的成員屬性時(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 序列化時(shí)觸發(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("在被序列化時(shí)被調(diào)用");
    }
}
$f=new demo1();
echo("00000"."</br>");
serialize($f);
?>

輸出結(jié)果

__wakeup

當(dāng)進(jìn)行unserialize 反序列化對象時(shí),__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("在被反序列化時(shí)被調(diào)用");
    }
}
$f=new demo1();
$uz=serialize($f);
echo("00000"."</br>");
unserialize($uz);
?>

輸出結(jié)果

__toString

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

<?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)一個(gè)對象類中存在__invoke魔術(shù)方法,這個(gè)對象類被當(dāng)作函數(shù)進(jìn)行調(diào)用時(shí),就會觸發(fā)__invoke魔術(shù)方法,而不會產(chǎn)生錯(cuò)誤

<?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ù)方法超詳細(xì)講解的文章就介紹到這了,更多相關(guān)php反序列化 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • EarthLiveSharp中cloudinary的CDN圖片緩存自動(dòng)清理python腳本

    EarthLiveSharp中cloudinary的CDN圖片緩存自動(dòng)清理python腳本

    這篇文章主要介紹了EarthLiveSharp暫時(shí)沒有清理cloudinary的CDN圖片緩存的功能,于是我用python寫了一個(gè),并嘗試用gist管理,需要的朋友可以參考下
    2017-04-04
  • 利用PHP自動(dòng)生成印有用戶信息的名片

    利用PHP自動(dòng)生成印有用戶信息的名片

    對于日常照片的處理場景,通常我們的選擇都是利用手機(jī)上的眾多P圖軟件。使用它們就可以輕松便捷的實(shí)現(xiàn)添加文字的功能。而作為碼農(nóng)的我們,當(dāng)某一天我們需要在編寫的網(wǎng)頁應(yīng)用里添加這一功能時(shí),我們該利用何種語言和工具來實(shí)現(xiàn)這一目標(biāo)呢? 下面跟小編一起來看看。
    2016-08-08
  • 淺析PHP7的多進(jìn)程及實(shí)例源碼

    淺析PHP7的多進(jìn)程及實(shí)例源碼

    在本篇內(nèi)容里小編給大家分享了關(guān)于PHP7之多進(jìn)程的相關(guān)概念和實(shí)例代碼知識點(diǎn),需要的朋友們跟著學(xué)習(xí)下。
    2019-04-04
  • 用PHP調(diào)用Oracle存儲過程的方法

    用PHP調(diào)用Oracle存儲過程的方法

    php程序訪問數(shù)據(jù)庫,完全可以使用存儲過程,有人認(rèn)為使用存儲過程便于維護(hù)。不過仁者見仁,智者見智,在這個(gè)問題上,偶認(rèn)為使用存儲過程意味著必須要dba和開發(fā)人員更緊密配合,如果其中一方更變,則顯然難以維護(hù)。
    2008-09-09
  • 兩個(gè)開源的Php輸出Excel文件類

    兩個(gè)開源的Php輸出Excel文件類

    因?yàn)橛龅搅诉@個(gè)問題,所以到Google搜索了下。
    2010-02-02
  • php關(guān)于array_multisort多維數(shù)組排序的使用說明

    php關(guān)于array_multisort多維數(shù)組排序的使用說明

    對于PHP語言中的多維數(shù)組排序時(shí)最為復(fù)雜的一個(gè)排序方式。我們在實(shí)際編碼中將會用到PHP函數(shù)array_multisort()來實(shí)現(xiàn)這一復(fù)雜的排序。
    2011-01-01
  • PHP取得一個(gè)類的屬性和方法的實(shí)現(xiàn)代碼

    PHP取得一個(gè)類的屬性和方法的實(shí)現(xiàn)代碼

    PHP取得一個(gè)類的屬性和方法的實(shí)現(xiàn)代碼,需要的朋友可以參考下。
    2011-05-05
  • PHP解決短信驗(yàn)證碼轟炸的方法詳解

    PHP解決短信驗(yàn)證碼轟炸的方法詳解

    這篇文章主要為大家詳細(xì)介紹了如何利用PHP解決短信驗(yàn)證碼轟炸的問題,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-12-12
  • Json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法

    Json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法

    json_encode通常會把json中的漢字轉(zhuǎn)義成unicode,但是有些時(shí)候不是我們想要的,下面小編給大家介紹json_encode防止?jié)h字轉(zhuǎn)義成unicode的方法,需要的朋友參考下吧
    2016-02-02
  • PHP入門教程之上傳文件實(shí)例詳解

    PHP入門教程之上傳文件實(shí)例詳解

    這篇文章主要介紹了PHP入門教程之上傳文件的方法,結(jié)合實(shí)例形式詳細(xì)分析了php上傳文件的步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2016-09-09

最新評論

天峻县| 小金县| 舒城县| 乌鲁木齐县| 隆尧县| 长葛市| 鄂伦春自治旗| 莱阳市| 嵩明县| 石柱| 西丰县| 周口市| 梅州市| 紫云| 五原县| 孝义市| 双城市| 枣庄市| 陕西省| 富川| 彭水| 思茅市| 韶山市| 乌审旗| 西盟| 博罗县| 奈曼旗| 灌阳县| 扎赉特旗| 闽侯县| 于田县| 北海市| 新营市| 临高县| 车险| 武威市| 桐柏县| 西安市| 外汇| 海宁市| 亳州市|