php魔術方法整理

2021-09-02 18:45:05 字數 4207 閱讀 4994

__construct(), __destruct(), __call(), __callstatic(), __get(),__set(), __isset(), __unset(), __sleep(),__wakeup(), __tostring(),__invoke(), __set_state(), __clone() 和 __debuginfo() 等方法在 php 中被稱為"魔術方法"(magic methods)。在命名自己的類方法時不能使用這些方法名,除非是想使用其魔術功能

php 將所有以 __(兩個下劃線)開頭的類方法保留為魔術方法。所以在定義類方法時,除了上述魔術方法,建議不要以 __ 為字首。

1、建構函式和西溝函式

(1)建構函式 __construct()

php 5 允行開發者在乙個類中定義乙個方法作為建構函式。具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作

如果子類中定義了建構函式則不會隱式呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫parent::__construct()。如果子類沒有定義建構函式則會如同乙個普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話);

(2)析構函式 __destruct()

php 5 引入了析構函式的概念,這類似於其它物件導向的語言,如 c++。析構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷毀時執行。

和建構函式一樣,父類的析構函式不會被引擎暗中呼叫。要執行父類的析構函式,必須在子類的析構函式體中顯式呼叫 parent::__destruct()。此外也和建構函式一樣,子類如果自己沒有定義析構函式則會繼承父類的。

析構函式即使在使用 exit() 終止指令碼執行時也會被呼叫。在析構函式中呼叫 exit() 將會中止其餘關閉操作的執行。

析構函式在指令碼關閉時呼叫,此時所有的 http 頭資訊已經發出。指令碼關閉時的工作目錄有可能和在 sapi(如 apache)中時不同。

試圖在析構函式(在指令碼終止時被呼叫)中丟擲乙個異常會導致致命錯誤。

建構函式和西溝函式

2、過載

php所提供的"過載"(overloading)是指動態地"建立"類屬性和方法。我們是通過魔術方法(magic methods)來實現的。

當呼叫當前環境下未定義或不可見的類屬性或方法時,過載方法會被呼叫。

所有的過載方法都必須被宣告為 public。

5.1.0 新增 __isset() 和 __unset() 兩個魔術方法。

5.3.0 新增 __callstatic()魔術方法。可見性未設定為 public 或未宣告為 static 的時候會產生乙個警告。

note:

這些魔術方法的引數都不能通過引用傳遞。php中的"過載"與其它絕大多數物件導向語言不同。傳統的"過載"是用於提供多個同名的類方法,但各方法的引數型別和個數不同。

(1)屬性過載

public void __set ( string $name , mixed $value )

public mixed __get ( string $name )

public bool __isset ( string $name )

public void __unset ( string $name )

在給不可訪問屬性賦值時,__set() 會被呼叫。

讀取不可訪問屬性的值時,__get() 會被呼叫。

當對不可訪問屬性呼叫 isset() 或 empty() 時,__isset() 會被呼叫。

當對不可訪問屬性呼叫 unset() 時,__unset() 會被呼叫。

引數 $name 是指要操作的變數名稱。__set() 方法的 $value 引數指定了 $name 變數的值。

屬性過載只能在物件中進行。在靜態方法中,這些魔術方法將不會被呼叫。所以這些方法都不能被 宣告為 static。從 php 5.3.0 起, 將這些魔術方法定義為 static 會產生乙個警告。

(2)方法過載

public mixed __call ( string $name , array $arguments )

public static mixed __callstatic ( string $name , array $arguments )

在物件中呼叫乙個不可訪問方法時,__call() 會被呼叫。

在靜態上下文中呼叫乙個不可訪問方法時,__callstatic() 會被呼叫。

$name 引數是要呼叫的方法名稱。$arguments 引數是乙個列舉陣列,包含著要傳遞給方法 $name 的引數。過載

3、物件複製

物件複製可以通過 clone 關鍵字來完成(如果可能,這將呼叫物件的 __clone() 方法)。物件中的 __clone() 方法不能被直接呼叫。

$copy_of_object = clone $object;

當物件被複製後,php 5 會對物件的所有屬性執行乙個淺複製(shallow copy)。所有的引用屬性 仍然會是乙個指向原來的變數的引用。

當複製完成時,如果定義了 __clone() 方法,則新建立的物件(複製生成的物件)中的 __clone() 方法會被呼叫,可用於修改屬性的值(如果有必要的話)。

更多物件複製請前往->

物件複製

4、剩餘的魔術方法

(1)__sleep() 和__wakeup()

public array__sleep( void )

void__wakeup( void )

__sleep() 方法常用於提交未提交的資料,或類似的清理操作。同時,如果有一些很大的物件,但不需要全部儲存,這個功能就很好用。

與之相反,unserialize() 會檢查是否存在乙個 __wakeup() 方法。如果存在,則會先呼叫 __wakeup 方法,預先準備物件需要的資源。

__wakeup() 經常用在反序列化操作中,例如重新建立資料庫連線,或執行其它初始化操作。

note:

__sleep() 不能返回父類的私有成員的名字。這樣做會產生乙個e_notice級別的錯誤。可以用serializable介面來替代。

serialize() 函式會檢查類中是否存在乙個魔術方法 __sleep()。如果存在,該方法會先被呼叫,然後才執行序列化操作。此功能可以用於清理物件,並返回乙個包含物件中所有應被序列化的變數名稱的陣列。如果該方法未返回任何內容,則null被序列化,並產生乙個e_notice級別的錯誤

(2)__tostring()

public string__tostring( void )

__tostring() 方法用於乙個類被當成字串時應怎樣回應。例如 echo $obj; 應該顯示些什麼。此方法必須返回乙個字串,否則將發出一條e_recoverable_error級別的致命錯誤。

(3) __invoke()

mixed__invoke([$...] )

當嘗試以呼叫函式的方式呼叫乙個物件時,__invoke()方法會被自動呼叫。

note: 本特性只在 php 5.3.0 及以上版本有效。

(4) __set_state()

static object__set_state( array$properties)

自 php 5.1.0 起當呼叫 var_export() 匯出類時,此靜態 方法會被呼叫。

本方法的唯一引數是乙個陣列,其中包含按 array('property' => value, ...) 格式排列的類屬性。

(5) __debuginfo()

arrray __debuginfo( void )

在轉儲物件以獲得應該顯示的屬性時,var_dump()呼叫此方法。如果該方法沒有在物件上定義,那麼將顯示所有公共、受保護和私有屬性。

php5.6以後支援此特性

以上4相關的魔術方法的詳細解釋和例子請前往 魔術方法

php魔術常量,魔術方法

魔術常量 1。line 返回檔案中的當前行號。2。file 返回檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自php4.0.2 起,file 總是包含乙個絕對路徑,而在此之前的版本有時會包含乙個相對路徑。3。function 返回函式名稱 php4.3.0 新加 自php5 起本常量返...

invoke 魔術 PHP 魔術方法

php 魔術方法 構造方法 construct 析構方法 destruct get 與 set unset call 和 callstatic sleep 和 wakeup clone tostring invoke set state debuginfo construct 這個方法應該是最常用的...

php魔術方法

php5魔術方法 魔術函式 1。construct 建構函式 例項化物件時被呼叫,當 construct和以類名為函式名的建構函式同時存在時,construct將被呼叫,另乙個不被呼叫。2。destruct 析構函式 當刪除乙個物件或物件操作終止時被呼叫 程式結束後物件就摧毀 永遠都是最後執行的。3...