這篇文章主要介紹了關於PHP中的魔術方法和魔術常數,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
在實例化一個物件的時候,順便在類別名稱的後面增加一些用括號括起來的參數列表(可以理解為建構方法的實參)
#與建構方法是一對,建構方法是在一個物件「出生」的時候自動呼叫的,而析構方法是在一個物件「消失」的時候由系統自動呼叫的!
析構方法是在物件消失之前呼叫
物件消失的幾種情況
1, 明確的使用unset函數銷毀一個變數
2, 腳本執行結束之後,也會自動銷毀
3, 改變物件變數的值,也會自動銷毀
#析構方法的作用
主要的功能就是用來釋放物件所佔用的額外的資源!而不是對象本身!
#注意:
析構方法通常不太需要額外的定義,只有當釋放額外資源(不屬於這個物件資源)的時候才需要定義!
總結建構方法和析構方法的特性:
1, 都以__開頭
2, 都是自動呼叫
#3, 都是某個特定情況發生的時候才會呼叫對應的方法
同時滿足以上三個特點的方法在php還有很多,被稱之為「魔術方法」!
就是在複製一個物件的時候自動呼叫該魔術方法!負責對克隆出來的新物件進行相關的初始化!
為無法存取的屬性賦值: __set()
一旦定義了__set()魔術方法,為不可存取的屬性賦值的時候,就會自動的執行方法,此時,處理權就交給使用者自己了!
此魔術方法需要兩個參數:
#一個是該不可存取的屬性的屬性名稱
一個是該不可存取的屬性的值
#
獲得不可存取的屬性的值: __get()
一旦定義了__get()魔術方法,取得不可存取的屬性的值的時候,就會自動的執行該方法,此時,處理權就交給使用者自己了!
該魔術方法,只需要一個參數,就是該屬性的屬性名稱!
##注意:
__get和
__set兩個方法往往在真實的項目中都是成對出現的!而且,往往就是利用這兩個方法批量的對物件的私有屬性進行處理!
#__unset()刪除無法存取的屬性
刪除無法存取的屬性:
__unset()一般來說,可以透過unset函數刪除物件的某個公開的屬性: #但是,如果該屬性是不可存取的(例如
private或不存在),則會自動執行
__unset方法,究竟是否可以刪除成功,還是取決於
__unset
的內部實作!
該方法也只需要一個參數,就是目前刪除的屬性名稱!
#假如__unset裡面什麼都沒做,預設的就是無法刪除(當然也不會報錯!)
__isset()判斷不可存取的屬性是否存在
##判斷不可存取的屬性是否存在:
### __isset()##########如果該屬性是無法存取的屬性,判斷這個屬性是否存在的時候,會自動觸發該方法的執行! ############同樣的,方法也需要一個參數,技術目前需要判斷的屬性名稱! ######當呼叫一個不可存取的物件方法(非靜態方法),會自動的執行該魔術方法!
思考:
#此時的這個魔術方法需要幾個參數?
參數一:方法名,string類型
參數二:array型,因為參數的個數不確定,只能把所有的參數放到一個陣列裡面
假如這個方法什麼都不做:
當呼叫一個不可存取的類別方法(靜態方法)的時候,會自動執行該魔術方法,定義這個方法的時候,需要在方法名稱的前面加上static 關鍵字,因為該方法應該是一個靜態方法!
一個小案例
設計數學類,達到以下的目的:
#呼叫方法f1:
1, 如果傳入的是1個參數,則回傳其平方的值
2, 如果傳入的是2個參數,則回傳其平方總和
3, 如何傳入的是3 個參數,傳回其立方總和
就是利用方法重載來完成:
當我們把物件當作函數(或方法)來呼叫的時候,會自動執行該魔術方法!目前而不是很常用!
回想前面學過的匿名函數:
注意:
之所以可以使用$func閉包物件成功的呼叫函數,就是因為閉包物件裡面有一個__invoke魔術方法
#當我們把一個物件當成是一個字串來使用的時候,會自動的執行該模仿方法!
而且該方法的回傳值,一般可以是該物件序列化成字串的結果!
事實上,此時系統會自動觸發執行__toString這個方法:
代表的是目前的類別名稱!
注意與self的差異:
self是指該類別的本身(一種結構,不只包含類別名稱),而__CLASS__只是一個類別名稱(類別名稱只是類別的一部分!)
代表目前的方法名稱!
幾個PHP 的"魔術常數" | |
名稱 |
|
說明 |
|
###########__LINE__### ##########檔案中的目前行號。 ##################__FILE__#### | 檔案的完整路徑和檔案名稱。如果用在被包含檔案中,則傳回被包含的檔案名稱。 |
__DIR__ |
」檔案所在的目錄。如果用在被包含檔案中,則傳回被包含的檔案所在的目錄。它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。 |
__FUNCTION__ |
函數名稱。本常數傳回該函數被定義時的名字(區分大小寫)。 |
__CLASS__ |
#類別的名稱,本常數傳回該類別被定義時的名字(區分大小寫) 。注意自 PHP 5.4 起 __CLASS__ 對 trait 也起作用。當用在 trait 方法時,__CLASS__ 是呼叫 trait 方法的類別的名字。 |
__TRAIT__ |
#Trait 的名字。自 PHP 5.4 起此常數傳回 trait 被定義時的名字(區分大小寫)。 Trait 名包括其被宣告的作用區域(例如 Foo\Bar)。 |
__METHOD__ |
#類別的方法名稱(PHP 5.0.0 新加)。傳回該方法被定義時的名字(區分大小寫)。 |
__NAMESPACE__ |
#目前命名空間的名稱(區分大小寫)。 |
以上是PHP中的魔術方法和魔術常數的詳細內容。更多資訊請關注PHP中文網其他相關文章!