init,__construct區別以及PHP魔術方法大彙總

守護大白菜發表於2017-03-10

init()是框架設定為初始化函式,當然框架內部還是用的___construct()內建函式;如果你是框架開發者,你當然也可以把初始化函式寫成__init(),begin(),start()等

PS:php內部的幾個魔術方法
PHP把所有以__(兩個下劃線)開頭的類方法當成魔術方法
1)__construct()
這樣的方法是建構函式,適合在使用物件前做一些初始化工作(注意:在5.3.3之後的版本與類名相同的方法不在是作為建構函式),注意在子類需要使用父類建構函式需要顯示呼叫parent::__construct()
2)__destruct()
與建構函式對應的是這個函式,這個是解構函式,物件的所有引用都被刪除或者當前物件被顯示銷燬才執行
如果需要呼叫父類解構函式也需要顯式呼叫parent::__destruct()。注意這個解構函式即使呼叫exit()函式也會執行
3)__call()
如果呼叫了當前環境下未定義(包含沒有許可權訪問的)和不可見屬性或者方法,這個方法會呼叫本類__call,如果沒有的話就會呼叫父類的__call方法
4)__callStatic()
5.3.0新增方法,主要用於靜態方法中,同樣的,這個方法必須使用public修飾
5)__get()
讀取未定義變數會呼叫該方法
6)__set()
5.1.0之後增加,未定義變數賦值會呼叫該方法
7)__isset()
當對未定義變數呼叫isset()或者empty()時呼叫該方法
8)__unset()
對未定義變數呼叫unset(),該魔術方法才會生效
9)__sleep()
serialize() 檢查類中是否有魔術名稱__sleep 的函式。如果這樣,該函式將在任何序列化之前執行。它可以清除物件並應該返回一個包含有該物件中應被序列化的所有變數名的陣列。使用__sleep 的目的是關閉物件可能具有的任何資料庫連線,提交等待中的資料或進行類似的清除任務。此外,如果有非常大的物件而並不需要完全儲存下來時此函式也很有用。
10)__wakeup()
unserialize() 檢查具有魔術名稱 __wakeup 的函式的存在。如果存在,此函式可以重建物件可能具有的任何資源。使用 __wakeup 的目的是重建在序列化中可能丟失的任何資料庫連線以及處理其它重新初始化的任務。
11)__toString()
__toString方法在將一個物件轉化成字串時自動呼叫
PHP 5.2.0之前,__toString方法只有結合使用echo() 或 print()時 才能生效。PHP 5.2.0之後,則可以在任何字串環境生效(例如通過printf(),使用%s修飾符),但 不能用於非字串環境(如使用%d修飾符)。從PHP 5.2.0,如果將一個未定義__toString方法的物件 轉換為字串,會報出一個E_RECOVERABLE_ERROR錯誤
12)__invoke()
當嘗試以呼叫函式的方式呼叫一個物件時,__invoke() 方法會被自動呼叫,注意只能在5.3.0以後才能使用
13)__set_state()
當呼叫 var_export()時,這個靜態 方法會被呼叫(自PHP 5.1.0起有效)。
14)__clone()
當複製完成時, 如果定義了__clone()方法, 則新建立的物件(複製生成的物件)中的__clone()方法會被呼叫, 可用於修改屬性的值(如果有必要的話)。因為php物件賦值使用的引用傳遞,新物件會更改原物件的屬性和方法

相關文章