在面向?qū)ο缶幊讨?,PHP提供了一系列的魔術(shù)方法,這些魔術(shù)方法為編程提供了很多便利。PHP中的魔術(shù)方法通常以__(兩個下劃線)開始,并且不需要顯示的調(diào)用而是由某種特定的條件出發(fā)。這篇文章簡單總結(jié)了PHP中提供的魔術(shù)方法。
__construct()
__construct()是類的構(gòu)造函數(shù),是目前為止最經(jīng)常使用的函數(shù)。在創(chuàng)建對象時,可以在構(gòu)造函數(shù)中做一些初始化工作??梢詾闃?gòu)造函數(shù)定義任意多個參數(shù),只要在實(shí)例化時傳入對應(yīng)個數(shù)的參數(shù)即可。構(gòu)造函數(shù)中出現(xiàn)的任何異常都會阻止對象的創(chuàng)建。
__desctruct()
__desctruct()是類的析構(gòu)函數(shù),通常在銷毀對象或腳本執(zhí)行結(jié)束時自動調(diào)用,析構(gòu)函數(shù)不接收任何參數(shù)。經(jīng)常在析構(gòu)函數(shù)中執(zhí)行一些清理工作,比如關(guān)閉數(shù)據(jù)庫連接等。
__call()
__call()在調(diào)用不存在或不可訪問的方法時會被調(diào)用。它接收兩個參數(shù),一個是調(diào)用的方法的名字,一個是包含函數(shù)參數(shù)的數(shù)組。我們可以使用這種方法調(diào)用子對象中得同名函數(shù)
__callStatic()
__callStatic()當(dāng)調(diào)用的靜態(tài)方法不存在或權(quán)限不足時會被調(diào)用。它接收兩個參數(shù),一個是調(diào)用的方法的名字,一個是包含函數(shù)參數(shù)的數(shù)組。其使用跟__call()完全一樣。
__get()
__get()在我們嘗試訪問一個不存在的屬性或者非公有屬性時會被調(diào)用。它接收一個參數(shù),該參數(shù)表示訪問屬性的名字,并且將該屬性的值返回
__set()
__set()在我們嘗試修改一個不可訪問的屬性時會被調(diào)用,它接收兩個參數(shù),一個表示屬性的名字,一個表示屬性的值。
__isset()
__isset()在對一個不可訪問的屬性調(diào)用isset()或empty()方法時會被調(diào)用,它接收一個參數(shù),表示屬性的名字。它應(yīng)該返回一個布爾值,用來表示該屬性是否存在。
__unset()
__unset()在調(diào)用 unset()函數(shù)銷毀一個不能訪問的屬性時會被調(diào)用,它接收一個參數(shù),表述屬性的名字。
__sleep()
__sleep()在對一個對象序列化時(調(diào)用 serialize())會被調(diào)用。它不接收任何參數(shù),而且應(yīng)該返回一個包含所有應(yīng)該被序列化的屬性的數(shù)組。在該魔術(shù)方法中,也可以執(zhí)行一些其他操作。
有一點(diǎn)要注意的是,不要再該函數(shù)中進(jìn)行任何的析構(gòu)操作,因?yàn)檫@可能會影響正在運(yùn)行的對象
__wakeup()
__wakeup()在對存儲的對象反序列化時會被調(diào)用。它不接收任何參數(shù),也沒有任何返回值??梢杂盟鼇硖幚碓谛蛄谢瘯r丟失的數(shù)據(jù)庫連接或資源
__toString()
__toString()在我們將對象當(dāng)作字符串一樣使用時會被調(diào)用,它不接收任何參數(shù)。該方法允許我們定義對象的表現(xiàn)形式。
__invoke()
調(diào)用函數(shù)的方式調(diào)用一個對象時的回應(yīng)方法
__set_state()
調(diào)用var_export()導(dǎo)出類時,此靜態(tài)方法會被調(diào)用。
__clone()
__clone()可以解決上面的問題。當(dāng)對一個對象使用 clone 關(guān)鍵字時,該魔術(shù)方法會被調(diào)用。