什么是魔術(shù)方法?是不是感覺很神奇的名字,下面我們舉例說明!
默認(rèn)不存在,但是如果用戶定義了相關(guān)的方法,則在相應(yīng)的情況發(fā)生時(shí) 會(huì)自動(dòng)執(zhí)行的方法,稱之為魔術(shù)方法。通常 魔術(shù)方法都是以 __開頭。
舉例說明
1)__autoload() :當(dāng)程序?qū)嵗硞€(gè)類,而該類沒有在當(dāng)前文件中被引入。此時(shí)會(huì)觸發(fā)執(zhí)行__autoload()。程序希望通過該方法,自動(dòng)引入這個(gè)類文件。該方法有一個(gè) 參數(shù),即就是那個(gè)忘記引入的類的名稱。__autoload()方法的工作原理是什么?當(dāng)程序執(zhí)行到實(shí)例化某個(gè)類的時(shí)候,如果在實(shí)例化前沒有引入這個(gè)類文 件,那么就自動(dòng)執(zhí)行__autoload()函數(shù)。這個(gè)函數(shù)會(huì)根據(jù)實(shí)例化的類的名稱來查找這個(gè)類文件的路徑,當(dāng)判斷這個(gè)類文件路徑下確實(shí)存在這個(gè)類文件 后,就執(zhí)行include或者require來載入該類,然后程序繼續(xù)執(zhí)行,如果這個(gè)路徑下不存在該文件時(shí)就提示錯(cuò)誤。使用自動(dòng)載入的魔術(shù)函數(shù)可以不必要 寫很多個(gè)include或者require函數(shù)。
2)__construct() : 這個(gè)是魔術(shù)構(gòu)造方法。構(gòu)造方法是實(shí)例化對(duì)象的時(shí)候自動(dòng)執(zhí)行的方法,作用就是初始化對(duì)象。該方法可以沒有參數(shù),也可以有多個(gè)參數(shù)。如果有參數(shù),那么new這 個(gè)對(duì)象的時(shí)候要記得寫上相應(yīng)的參數(shù)。在php5以前,沒有魔術(shù)構(gòu)造方法,普通構(gòu)造方法是一個(gè)跟類名同名的方法來實(shí)現(xiàn)構(gòu)造的。如果一個(gè)類中既寫了魔術(shù)構(gòu)造方 法,又定義了普通構(gòu)造方法。那么php5以上版本中,魔術(shù)方法起作用,普通構(gòu)造方法不起作用。反之,在php5以前版本中,不認(rèn)識(shí)魔術(shù)構(gòu)造方法,只是把該 方法當(dāng)做普通的方法。
3)__destruct() :這個(gè)是魔術(shù)析構(gòu)方法。析構(gòu)方法的作用和構(gòu)造方法正好相反,是對(duì)象被銷毀時(shí)被自動(dòng)調(diào)用的,作用是釋放內(nèi)存。析構(gòu)方法沒有參數(shù)。
4)__call() :當(dāng)程序調(diào)用一個(gè)不存在或不可見的成員方法時(shí),自動(dòng)觸發(fā)執(zhí)行__call()。它有兩個(gè)參數(shù),分別是未訪問到的方法名稱和方法的參數(shù)。而第二個(gè)參數(shù)是數(shù)組類型。
5)__get() :當(dāng)程序調(diào)用一個(gè)未定義或不可見的成員屬性時(shí),自動(dòng)觸發(fā)執(zhí)行__get()。它有一個(gè)參數(shù),表示要調(diào)用的屬性的名稱。
6)__set():當(dāng)程序試圖寫入一個(gè)不存在或不可見的成員屬性時(shí),PHP就會(huì)自動(dòng)執(zhí)行__set()。它包含兩個(gè)參數(shù),分別表示屬性名稱和屬性值。
7)__tostring() :當(dāng)程序使用echo或print輸出對(duì)象時(shí),會(huì)自動(dòng)調(diào)用該方法。目的是希望通過該方法將對(duì)象轉(zhuǎn)化為字符串,再輸出。__tostring() 無參數(shù),但是該方法必須有返回值。
8)__clone() :當(dāng)程序clone一個(gè)對(duì)象的時(shí)候,能觸發(fā)__clone()方法,程序希望通過這個(gè)魔術(shù)方法實(shí)現(xiàn):不僅僅單純地克隆對(duì)象,還需要克隆出來的對(duì)象擁有原來對(duì)象的所有屬性和方法。