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