php反序列化之魔術(shù)方法超詳細(xì)講解_第1頁
php反序列化之魔術(shù)方法超詳細(xì)講解_第2頁
php反序列化之魔術(shù)方法超詳細(xì)講解_第3頁
php反序列化之魔術(shù)方法超詳細(xì)講解_第4頁
php反序列化之魔術(shù)方法超詳細(xì)講解_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第php反序列化之魔術(shù)方法超詳細(xì)講解目錄php魔術(shù)方法__construct()與__destruct()__call__get__set__isset__unset__sleep__wakeup__toString__invoke

php魔術(shù)方法

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

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

__construct(),類的構(gòu)造函數(shù)

__destruct(),類的析構(gòu)函數(shù)

__call(),在對(duì)象中調(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)對(duì)不可訪問屬性調(diào)用isset()或empty()時(shí)調(diào)用

__unset(),當(dāng)對(duì)不可訪問屬性調(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ù),與其他的語言如java,c#,一樣,構(gòu)造函數(shù)就是在對(duì)象實(shí)例化的時(shí)候先執(zhí)行初始化的方法。

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

php

classdemo1{

private$k1;

publicfunction__construct()

echo("構(gòu)造函數(shù)被調(diào)用"."br

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

echo("0000"."br

$f=newdemo1();

echo("1111"."br

$a=serialize($f);

echo("2222"."br

unserialize($a);

輸出結(jié)果

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

php

classdemo1{

private$k1;

publicfunction__destruct()

echo("析構(gòu)函數(shù)被調(diào)用"."br

$f=newdemo1();

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

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

//當(dāng)調(diào)用不存在的方法時(shí),方法名作為參數(shù)傳到$name變量,方法名的輸入?yún)?shù)傳到arguments參數(shù)列表中

publicfunction__call($name,$arguments)

//TODO:Implement__call()method.

echo($name."---".$arguments[0]);

$f=newdemo1();

$f-f2("123");//調(diào)用不存在的方法f2()

輸出結(jié)果

__get

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

php

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

publicfunction__get($name)//不存在的變量k會(huì)以參數(shù)傳到$name

echo($name);

$f=newdemo1();

$f-//不存在的變量k

輸出結(jié)果

__set

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

php

header("Content-Type:text/html;charset=utf-8");

highlight_file(__FILE__);

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

publicfunction__set($name,$value)

echo($name."---".$value);

$f=newdemo1();

$f-k=123;//給不存在的成員變量賦值

輸出結(jié)果

__isset

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

php

header("Content-Type:text/html;charset=utf-8");

highlight_file(__FILE__);

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

publicfunction__isset($name)

echo($name);

$f=newdemo1();

$f2=unserialize(serialize($f));//反序列化

isset($f2-//使用isset方法判斷私有成員屬性k1

empty($f2-//使用empty方法判斷私有成員屬性k1

輸出結(jié)果

__unset

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

php

header("Content-Type:text/html;charset=utf-8");

highlight_file(__FILE__);

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

publicfunction__unset($name)

echo($name);

$f=newdemo1();

$f2=unserialize(serialize($f));//反序列化

unset($f2-//使用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__);

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

publicfunction__sleep()

echo("在被序列化時(shí)被調(diào)用");

$f=newdemo1();

echo("00000"."/br

serialize($f);

輸出結(jié)果

__wakeup

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

php

header("Content-Type:text/html;charset=utf-8");

highlight_file(__FILE__);

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

publicfunction__wakeup()

echo("在被反序列化時(shí)被調(diào)用");

$f=newdemo1();

$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__);

classdemo1{

private$k1;

publicfunctionf1(){

echo("f1函數(shù)被調(diào)用");

publicfunction__toString()

echo("__toString被觸發(fā)了");

return"";

$f=newdemo1();

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(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論