PHP魔術(shù)方法須知

參考PHP手冊(cè):魔術(shù)方法

1.__construct([ mixed $args [, $... ]] )

具有構(gòu)造函數(shù)的類會(huì)在每次創(chuàng)建新對(duì)象時(shí)先調(diào)用此方法,用在使用對(duì)象之前做一些初始化工作。

Note:
1.如果子類中定義了構(gòu)造函數(shù)則不會(huì)隱式調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。
2.如果子類沒有定義構(gòu)造函數(shù)則會(huì)如同一個(gè)普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話)。
3.可以為構(gòu)造函數(shù)定義任意多個(gè)參數(shù),只要在實(shí)例化時(shí)傳入對(duì)應(yīng)個(gè)數(shù)的參數(shù)即可。構(gòu)造函數(shù)中出現(xiàn)的任何異常都會(huì)阻止對(duì)象的創(chuàng)建。
4.將構(gòu)造函數(shù)聲明為私有方法,可以防止在類外部創(chuàng)建對(duì)象,這在單利模式中經(jīng)常使用。

2.__destruct ( void )

析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷毀時(shí)執(zhí)行。

Note:
1.和構(gòu)造函數(shù)一樣,父類的析構(gòu)函數(shù)不會(huì)被引擎暗中調(diào)用。要執(zhí)行父類的析構(gòu)函數(shù),必須在子類的析構(gòu)函數(shù)體中顯式調(diào)用 parent::__destruct()。此外也和構(gòu)造函數(shù)一樣,子類如果自己沒有定義析構(gòu)函數(shù)則會(huì)繼承父類的。
2.析構(gòu)函數(shù)即使在使用exit()終止腳本運(yùn)行時(shí)也會(huì)被調(diào)用。在析構(gòu)函數(shù)中調(diào)用exit()將會(huì)中止其余關(guān)閉操作的運(yùn)行。
3.析構(gòu)函數(shù)在腳本關(guān)閉時(shí)調(diào)用,此時(shí)所有的 HTTP 頭信息已經(jīng)發(fā)出。腳本關(guān)閉時(shí)的工作目錄有可能和在 SAPI(如 apache)中時(shí)不同。
4.試圖在析構(gòu) 函數(shù)(在腳本終止時(shí)被調(diào)用)中拋出一個(gè)異常會(huì)導(dǎo)致致命錯(cuò)誤。

PHP所提供的"重載"(overloading)是指動(dòng)態(tài)地"創(chuàng)建"類屬性和方法。我們是通過魔術(shù)方法(magic methods)來實(shí)現(xiàn)的。

3.__call、__callStatic(方法重載)

public mixed __call ( string $name , array $arguments )
public static mixed __callStatic ( string $name , array $arguments )

在對(duì)象中調(diào)用一個(gè)不可訪問方法時(shí),__call() 會(huì)被調(diào)用。
在靜態(tài)上下文中調(diào)用一個(gè)不可訪問方法時(shí),__callStatic()會(huì)被調(diào)用。

說明:
1.$name 參數(shù)是要調(diào)用的方法名稱。
2.$arguments 參數(shù)是一個(gè)枚舉數(shù)組,包含著要傳遞給方法 $name 的參數(shù)。
3.PHP 5.3.0版本新增 __callStatic()魔術(shù)方法。可見性未設(shè)置為 public 或未聲明為 static 的時(shí)候會(huì)產(chǎn)生一個(gè)警告。

4.__set、__get、__isset、__unset

public void __set ( string $name , mixed $value )
在給不可訪問屬性賦值時(shí),__set() 會(huì)被調(diào)用。

public mixed __get ( string $name )
讀取不可訪問屬性的值時(shí),__get()會(huì)被調(diào)用。

public bool __isset ( string $name )
當(dāng)對(duì)不可訪問屬性調(diào)用 isset()empty()時(shí),__isset()會(huì)被調(diào)用。

public void __unset ( string $name )
當(dāng)對(duì)不可訪問屬性調(diào)用 unset()時(shí),__unset() 會(huì)被調(diào)用。

說明:
1.參數(shù)$name是指要操作的變量名稱。__set()方法的$value參數(shù)指定了 $name 變量的值。
2.屬性重載只能在對(duì)象中進(jìn)行。在靜態(tài)方法中,這些魔術(shù)方法將不會(huì)被調(diào)用。所以這些方法都不能被 聲明為 static。從 PHP 5.3.0 起, 將這些魔術(shù)方法定義為 static 會(huì)產(chǎn)生一個(gè)警告。
3.PHP 5.3.0 新增 __isset()__unset() 兩個(gè)魔術(shù)方法。

Note:
1.因?yàn)?PHP 處理賦值運(yùn)算的方式,__set() 的返回值將被忽略。類似的, 在下面這樣的鏈?zhǔn)劫x值中,__get() 不會(huì)被調(diào)用:$a = $obj->b = 8;

class TestClass
{
    private $foo;

    public function __set($name, $value){
        echo "__set().".$name.".".$value;
    }
    public function __get($get){
        echo "__get({$get})";
    }
}

$class = new TestClass();
$a = $class->foo;
$a = $class->foo = 8;

//輸出:
//__get(foo)
//__set().foo.8

Note:
2.在除 isset() 外的其它語言結(jié)構(gòu)中無法使用重載的屬性,這意味著當(dāng)對(duì)一個(gè)重載的屬性使用 empty() 時(shí),重載魔術(shù)方法將不會(huì)被調(diào)用。為避開此限制,必須將重載屬性賦值到本地變量再使用 empty()(很遺憾,這個(gè)不知道啥意思,如果有人看到,并且知道,深切的懇請(qǐng)告知,Q1563659827,先謝過!(*^__^*) )

5.__sleep()、__wakeup()

public array __sleep ( void )
方法常用于提交未提交的數(shù)據(jù),或類似的清理操作。同時(shí),如果有一些很大的對(duì)象,但不需要全部保存,這個(gè)功能就很好用。

void __wakeup ( void )
經(jīng)常用在反序列化操作中,例如重新建立數(shù)據(jù)庫(kù)連接,或執(zhí)行其它初始化操作。

6.__toString()

public string __toString ( void )
用于一個(gè)類被當(dāng)成字符串時(shí)應(yīng)怎樣回應(yīng)。例如 echo $obj; 應(yīng)該顯示些什么。此方法必須返回一個(gè)字符串,否則將發(fā)出一條E_RECOVERABLE_ERROR 級(jí)別的致命錯(cuò)誤。

7.__invoke()

mixed __invoke ([ $... ] )
當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí),__invoke()方法會(huì)被自動(dòng)調(diào)用。

Note:
本特性只在 PHP 5.3.0 及以上版本有效。

8.__set_state()

static object __set_state ( array $properties )
自 PHP 5.1.0 起當(dāng)調(diào)用 var_export() 導(dǎo)出類時(shí),此方法會(huì)被調(diào)用。
本方法的唯一參數(shù)是一個(gè)數(shù)組,其中包含按 array('property' => value, ...) 格式排列的類屬性。

9.__debugInfo

array __debugInfo ( void )
該方法在var_dump()類對(duì)象的時(shí)候被調(diào)用,如果沒有定義該方法,則var_dump會(huì)打印出所有的類屬性

10.__clone()

對(duì)象復(fù)制可以通過 clone 關(guān)鍵字來完成(如果可能,這將調(diào)用對(duì)象的 __clone() 方法)。對(duì)象中的 __clone() 方法不能被直接調(diào)用。

$copy_of_object = clone $object;

當(dāng)對(duì)象被復(fù)制后,PHP 5 會(huì)對(duì)對(duì)象的所有屬性執(zhí)行一個(gè)淺復(fù)制(shallow copy)。所有的引用屬性 仍然會(huì)是一個(gè)指向原來的變量的引用。

void __clone ( void )

當(dāng)復(fù)制完成時(shí),如果定義了 __clone() 方法,則新創(chuàng)建的對(duì)象(復(fù)制生成的對(duì)象)中的 __clone()方法會(huì)被調(diào)用,可用于修改屬性的值(如果有必要的話)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 一、數(shù)組 1、數(shù)組定義 數(shù)組就是一個(gè)鍵值對(duì)組成的語言結(jié)構(gòu),鍵類似于酒店的房間號(hào),值類似于酒店房間里存儲(chǔ)的東西。 $...
    空谷悠閱讀 814評(píng)論 4 11
  • 參考資料:PHP5 權(quán)威編程 PHP 中的類和對(duì)象 對(duì)象:萬物皆對(duì)象; 類: 任何對(duì)象,都...
    _1633_閱讀 772評(píng)論 0 4
  • PHP中的魔術(shù)方法總結(jié) :__construct, __destruct , __call, __callStat...
    bycall閱讀 598評(píng)論 0 0
  • 一、數(shù)組 1、數(shù)組的聲明:$arr = array(); 2、數(shù)組的初始化:PHP有兩種數(shù)組:索引數(shù)組、關(guān)聯(lián)數(shù)組。...
    yzw12138閱讀 1,223評(píng)論 2 2
  • 耿耿星河未曙天。 從不學(xué)習(xí)的路星河,可以因?yàn)槲闹幸痪洹肮⒐⑿呛游词锾臁北诚抡堕L(zhǎng)恨歌》;去北京做...
    南天九茴閱讀 559評(píng)論 1 3