首頁  >  文章  >  後端開發  >  PHP中的魔術方法和魔術常數

PHP中的魔術方法和魔術常數

不言
不言原創
2018-06-01 16:30:021831瀏覽

這篇文章主要介紹了關於PHP中的魔術方法和魔術常數,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

魔術方法

#__construct()建構方法

在實例化一個物件的時候,順便在類別名稱的後面增加一些用括號括起來的參數列表(可以理解為建構方法的實參)

 

__destruct()析構方法

#與建構方法是一對,建構方法是在一個物件「出生」的時候自動呼叫的,而析構方法是在一個物件「消失」的時候由系統自動呼叫的!

析構方法是在物件消失之前呼叫

物件消失的幾種情況

1, 明確的使用unset函數銷毀一個變數

2, 腳本執行結束之後,也會自動銷毀

3, 改變物件變數的值,也會自動銷毀

#析構方法的作用

主要的功能就是用來釋放物件所佔用的額外的資源!而不是對象本身!

 



#注意:

析構方法通常不太需要額外的定義,只有當釋放額外資源(不屬於這個物件資源)的時候才需要定義!

總結建構方法和析構方法的特性:

1, 都以__開頭

2, 都是自動呼叫

#3, 都是某個特定情況發生的時候才會呼叫對應的方法

同時滿足以上三個特點的方法在php還有很多,被稱之為「魔術方法」!

__clone()複製一個物件的時候自動呼叫該魔術方法

就是在複製一個物件的時候自動呼叫該魔術方法!負責對克隆出來的新物件進行相關的初始化!

 

 

#__set()為無法存取的屬性賦值

為無法存取的屬性賦值: __set()

一旦定義了__set()魔術方法,為不可存取的屬性賦值的時候,就會自動的執行方法,此時,處理權就交給使用者自己了!

此魔術方法需要兩個參數:

#一個是該不可存取的屬性的屬性名稱

一個是該不可存取的屬性的值

#

 


__get()獲得不可存取的屬性的值

獲得不可存取的屬性的值:  __get()

一旦定義了__get()魔術方法,取得不可存取的屬性的值的時候,就會自動的執行該方法,此時,處理權就交給使用者自己了!

該魔術方法,只需要一個參數,就是該屬性的屬性名稱!

 

 


##注意:

__get

__set

兩個方法往往在真實的項目中都是成對出現的!而且,往往就是利用這兩個方法批量的對物件的私有屬性進行處理!

 


以上的程式碼還可以限制使用者增加屬性,以確保屬性的原有的內部結構不會改變!  

#__unset()刪除無法存取的屬性

刪除無法存取的屬性:

  __unset()一般來說,可以透過unset函數刪除物件的某個公開的屬性: #但是,如果該屬性是不可存取的(例如

private

或不存在),則會自動執行

__unset方法,究竟是否可以刪除成功,還是取決於

__unset

的內部實作!


 

該方法也只需要一個參數,就是目前刪除的屬性名稱!  

#假如__unset裡面什麼都沒做,預設的就是無法刪除(當然也不會報錯!)

__isset()判斷不可存取的屬性是否存在

##判斷不可存取的屬性是否存在:

###  __isset()##########如果該屬性是無法存取的屬性,判斷這個屬性是否存在的時候,會自動觸發該方法的執行! ############同樣的,方法也需要一個參數,技術目前需要判斷的屬性名稱! ######

__call()當呼叫一個不可存取的物件方法(非靜態方法)

當呼叫一個不可存取的物件方法(非靜態方法),會自動的執行該魔術方法!

思考:

#此時的這個魔術方法需要幾個參數?

參數一:方法名,string類型

參數二:array型,因為參數的個數不確定,只能把所有的參數放到一個陣列裡面

假如這個方法什麼都不做:

__callstatic()呼叫一個不可存取的類別方法(靜態方法)

當呼叫一個不可存取的類別方法(靜態方法)的時候,會自動執行該魔術方法,定義這個方法的時候,需要在方法名稱的前面加上static 關鍵字,因為該方法應該是一個靜態方法!

一個小案例

設計數學類,達到以下的目的:

#呼叫方法f1:

1, 如果傳入的是1個參數,則回傳其平方的值

2, 如果傳入的是2個參數,則回傳其平方總和

3, 如何傳入的是3 個參數,傳回其立方總和

就是利用方法重載來完成:

##__invoke()

當我們把物件當作函數(或方法)來呼叫的時候,會自動執行該魔術方法!目前而不是很常用!

回想前面學過的匿名函數:

注意:

之所以可以使用$func閉包物件成功的呼叫函數,就是因為閉包物件裡面有一個__invoke魔術方法

__toString()

#當我們把一個物件當成是一個字串來使用的時候,會自動的執行該模仿方法!

而且該方法的回傳值,一般可以是該物件序列化成字串的結果!

事實上,此時系統會自動觸發執行__toString這個方法:

魔術常數

__CLASS__

代表的是目前的類別名稱!

注意與self的差異:

self

是指該類別的本身(一種結構,不只包含類別名稱),而__CLASS__只是一個類別名稱(類別名稱只是類別的一部分!)

__METHOD__

代表目前的方法名稱!

__LINE__

幾個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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn