php反序列化之魔術(shù)方法超詳細(xì)講解
php魔術(shù)方法
在php類保留方法中以 “__”兩個(gè)下劃線開(kāi)頭的函數(shù)稱為魔術(shù)方法,我的理解為php類設(shè)計(jì)中自定義好的函數(shù)。
常見(jiàn)的魔術(shù)方法有:
__construct(),類的構(gòu)造函數(shù)
__destruct(),類的析構(gòu)函數(shù)
__call(),在對(duì)象中調(diào)用一個(gè)不可訪問(wèn)方法時(shí)調(diào)用
__callStatic(),用靜態(tài)方式中調(diào)用一個(gè)不可訪問(wèn)方法時(shí)調(diào)用
__get(),獲得一個(gè)類的成員變量時(shí)調(diào)用
__set(),設(shè)置一個(gè)類的成員變量時(shí)調(diào)用
__isset(),當(dāng)對(duì)不可訪問(wèn)屬性調(diào)用isset()或empty()時(shí)調(diào)用
__unset(),當(dāng)對(duì)不可訪問(wèn)屬性調(diào)用unset()時(shí)被調(diào)用
__sleep(),執(zhí)行serialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
__wakeup(),執(zhí)行unserialize()時(shí),先會(huì)調(diào)用這個(gè)函數(shù)
__toString(),類被當(dāng)成字符串時(shí)的回應(yīng)方法
__invoke(),調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí)的回應(yīng)方法
__set_state(),調(diào)用var_export()導(dǎo)出類時(shí),此靜態(tài)方法會(huì)被調(diào)用
__clone(),當(dāng)對(duì)象復(fù)制完成時(shí)調(diào)用
__autoload(),嘗試加載未定義的類
__debugInfo(),打印所需調(diào)試信息
__construct()與__destruct()
__construct() 構(gòu)造函數(shù)與 __destruct() 析構(gòu)函數(shù),與其他的語(yǔ)言如java,c#,一樣,構(gòu)造函數(shù)就是在對(duì)象實(shí)例化的時(shí)候先執(zhí)行初始化的方法。
__construct()構(gòu)造函數(shù)只有在new 一個(gè)對(duì)象的時(shí)候會(huì)觸發(fā),在serialize 序列化和unserialize反序列化中都不會(huì)觸發(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ù)則在對(duì)象銷毀和serialize 反序列化的情況下會(huì)被觸發(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)前對(duì)象調(diào)用一個(gè)不存在的方法時(shí),就會(huì)被觸發(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)訪問(wèn)一個(gè)對(duì)象不存在的變量時(shí)就會(huì)被觸發(fā)
<?php class demo1{ private $k1; public function f1(){ echo("f1 函數(shù)被調(diào)用"); } public function __get($name)//不存在的變量k會(huì)以參數(shù)傳到$name { echo($name); } } $f=new demo1(); $f->k;//不存在的變量k ?>
輸出結(jié)果
__set
__set() 魔術(shù)方法是當(dāng)給一個(gè)對(duì)象不存在的變量賦值時(shí)就會(huì)被觸發(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)對(duì)不可訪問(wèn)屬性調(diào)用isset()或empty()時(shí)會(huì)觸發(fā),例如訪問(wè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 __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è)不可訪問(wèn)的成員屬性時(shí)會(huì)觸發(fā),不可訪問(wè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 __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)對(duì)象被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 反序列化對(duì)象時(shí),__wakeup魔術(shù)方法會(huì)被觸發(fā),看起來(lái)__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è)對(duì)象類中存在__toString魔術(shù)方法,這個(gè)對(duì)象類被當(dāng)做字符串進(jìn)行處理時(shí),就會(huì)觸發(fā)__toString魔術(shù)方法,而不會(huì)產(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è)對(duì)象類中存在__invoke魔術(shù)方法,這個(gè)對(duì)象類被當(dāng)作函數(shù)進(jìn)行調(diào)用時(shí),就會(huì)觸發(fā)__invoke魔術(shù)方法,而不會(huì)產(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP中Array相關(guān)函數(shù)簡(jiǎn)介
在php教程中數(shù)組是種強(qiáng)大的數(shù)據(jù)類型,他可以做的事情很多,可以存儲(chǔ)不同的數(shù)據(jù)類型在一個(gè)數(shù)組中,下面我們列出了數(shù)組常用的操作,排序,鍵名對(duì)數(shù)組排序等做法。2016-07-07php獲取本機(jī)真實(shí)IP地址實(shí)例代碼
這篇文章主要為大家詳細(xì)介紹了php獲取本機(jī)真實(shí)IP地址實(shí)例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03php實(shí)現(xiàn)比較兩個(gè)字符串日期大小的方法
這篇文章主要介紹了php實(shí)現(xiàn)比較兩個(gè)字符串日期大小的方法,涉及php日期操作的相關(guān)技巧,需要的朋友可以參考下2015-05-05php多數(shù)據(jù)庫(kù)支持的應(yīng)用程序設(shè)計(jì)
以前做PHP應(yīng)用,多數(shù)是單數(shù)據(jù)庫(kù)數(shù)據(jù)查詢和更新,頂多也是主從數(shù)據(jù)庫(kù)的支持,實(shí)現(xiàn)起來(lái)相對(duì)簡(jiǎn)單。主從數(shù)據(jù)庫(kù)的問(wèn)題在于,當(dāng)會(huì)話存儲(chǔ)在數(shù)據(jù)庫(kù)的時(shí)候,同步將可能出現(xiàn)問(wèn)題,也就是說(shuō)有可能出現(xiàn)會(huì)話的中斷。2008-08-08golang、python、php、c++、c、java、Nodejs性能對(duì)比
這篇文章主要介紹了golang、python、php、c++、c、java、Nodejs性能對(duì)比的相關(guān)資料,需要的朋友可以參考下2017-03-03PHP中常見(jiàn)的緩存技術(shù)實(shí)例分析
這篇文章主要介紹了PHP中常見(jiàn)的緩存技術(shù),以實(shí)例形式較為詳細(xì)的分析了php中緩存技術(shù)的原理、特點(diǎn)及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09