1. 程式人生 > 其它 >php魔術方法小結

php魔術方法小結

php魔術方法

__construct()

  • __construct(mixed ...$values = ""): void
PHP 允許開發者在一個類中定義一個方法作為建構函式。具有建構函式的類會在每次建立新物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。 

__destruct()

  • __destruct(): void
PHP 有解構函式的概念,這類似於其它面向物件的語言,如 C++。解構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷燬時執行。

__call()

  • public __call(string $name, array $arguments
    ): mixed
  • 在物件中呼叫一個不可訪問方法時,__call() 會被呼叫

__callStatic()

  • 在靜態上下文中呼叫一個不可訪問方法時,__callStatic() 會被呼叫。
在物件中呼叫一個不可訪問方法時,__call() 會被呼叫。 
在靜態上下文中呼叫一個不可訪問方法時,__callStatic() 會被呼叫。 
$name 引數是要呼叫的方法名稱。$arguments 引數是一個列舉陣列,包含著要傳遞給方法 $name 的引數。 
這裡差別就是  __call()是屬於物件的,__callstatic()是屬於類的
一個是物件在呼叫不可訪問方法時觸發,一個是類在使用不可訪問的方法時觸發

__set()

  • ​ public __set(string $name, mixed $value): void
在給不可訪問(protected 或 private)或不存在的屬性賦值時,__set() 會被呼叫。

__get()

  • public __get(string $name): mixed
讀取不可訪問(protected 或 private)或不存在的屬性的值時,__get() 會被呼叫。 

__isset()

  • public __isset(string $name): bool
當對不可訪問(protected 或 private)或不存在的屬性呼叫 isset() 或 empty() 時,__isset() 會被呼叫。 

__unset()

  • public __unset(string $name): void
當對不可訪問(protected 或 private)或不存在的屬性呼叫 unset() 時,__unset() 會被呼叫。 
注意:

因為 PHP 處理賦值運算的方式,__set() 的返回值將被忽略。類似的, 在下面這樣的鏈式賦值中,__get() 不會被呼叫:

 $a = $obj->b = 8; 

__sleep()

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

__wakeup()

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

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

__serialize()

serialize() 函式會檢查類中是否存在一個魔術方法 __serialize() 。如果存在,該方法將在任何序列化之前優先執行。它必須以一個代表物件序列化形式的 鍵/值 成對的關聯陣列形式來返回,如果沒有返回陣列,將會丟擲一個 TypeError 錯誤。 

__unserialize()

serialize() 函式會檢查類中是否存在一個魔術方法 __serialize() 。如果存在,該方法將在任何序列化之前優先執行。它必須以一個代表物件序列化形式的 鍵/值 成對的關聯陣列形式來返回,如果沒有返回陣列,將會丟擲一個 TypeError 錯誤。

__tostring()

  • public __toString(): string
__toString() 方法用於一個類被當成字串時應怎樣迴應。例如 echo $obj; 應該顯示些什麼

__invoke()

  • __invoke( ...$values): mixed
當嘗試以呼叫函式的方式呼叫一個物件時,__invoke() 方法會被自動呼叫

__set_state()

  • ​ static __set_state(array $properties): object
 當呼叫 var_export() 匯出類時,此靜態 方法會被呼叫。

本方法的唯一引數是一個數組,其中包含按 ['property' => value, ...] 格式排列的類屬性。 

var_export

  • var_export(mixed $value, bool $return = false): ?string
 var_export() 函式返回關於傳遞給該函式的變數的結構資訊,它和 var_dump() 函式類似,不同的是其返回的表示是合法的 PHP 程式碼。
引數

value:
    想要輸出的變數名。
return:
    此引數為 true 時,var_export() 將返回一個變數,而不是輸出它。

返回值:

引數 return 為 true 時返回變數。否則返回 null。

__clone()

  • __clone(): void
 在多數情況下,我們並不需要完全複製一個物件來獲得其中屬性。但有一個情況下確實需要:如果你有一個 GTK 視窗物件,該物件持有視窗相關的資源。你可能會想複製一個新的視窗,保持所有屬性與原來的視窗相同,但必須是一個新的物件(因為如果不是新的物件,那麼一個視窗中的改變就會影響到另一個視窗)。還有一種情況:如果物件 A 中儲存著物件 B 的引用,當你複製物件 A 時,你想其中使用的物件不再是物件 B 而是 B 的一個副本,那麼你必須得到物件 A 的一個副本。

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

$copy_of_object = clone $object;

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

__debuginfo()

  • __debugInfo(): array
當通過 var_dump() 轉儲物件,獲取應該要顯示的屬性的時候, 該函式就會被呼叫。如果物件中沒有定義該方法,那麼將會展示所有的公有、受保護和私有的屬性。 

小總結:

物件層面:
__construct() 在物件初始化的時候呼叫
__destruct()  在物件銷燬的時候呼叫
__wakeup()  反序列化前呼叫
__sleep() 序列化前呼叫
__serialize() 同sleep 兩者都存在時只調用serialize
__unserialize() 同wakeup 兩者都存在時只調用unserialize
__tostring()  物件在被當作字串輸出時呼叫,例如 echo
__invoke()  當嘗試以函式方法呼叫物件$a()呼叫
__clone()  物件被clone時呼叫
__set_state()  當被var_export()時呼叫


屬性層面:
__set() 物件在設定不可用或不存在的屬性時呼叫
__get()  獲取不可用或不存在的屬性時被呼叫
__isset() 呼叫 isset()函式或者empty()函式時呼叫
__unset() 呼叫unset()函式時呼叫

方法層面:
__call()  物件在呼叫不可用方法的時候呼叫
__callStatic()  類在呼叫不可用方法的時候呼叫

參考連線:

https://www.php.net/manual/zh/language.oop5.magic.php