本文提供一份 PHP 魔術方法的速查表,方便快速參考。
無論您是經驗豐富的 PHP 開發者還是 PHP 開發新手,如果您使用過 PHP 的面向對象編程,那麼您肯定已經使用過至少幾種 PHP 魔術方法。如果您尚未聽說過 PHP 魔術方法,讓我來介紹一下:
PHP 提供了許多魔術方法,例如 __destruct()
、__callStatic()
、__set()
、__unset()
、__wakeup()
、__invoke()
、__clone()
、__get()
、__call()
等。 避免在這些方法中編寫過多代碼,為清晰性和維護性考慮,最好為成員的獲取和設置定義明確的方法,或定義類方法。 __serialize()
和 __unserialize()
方法需要使用虛擬屬性。
示例:
<?php class Student { private $name; private $email; private $phone; private $db_connection_link; public function __construct($name, $email, $phone) { $this->name = $name; $this->email = $email; $this->phone = $phone; } public function __serialize() { return ['name' => $this->name, 'email' => $this->email, 'mobile' => $this->phone]; } public function __wakeup($data) { $this->name = $data['name']; $this->email = $data['email']; $this->phone = $data['mobile']; $this->db_connection_link = your_db_connection_function(); } } ?>
需要注意的是,只有當同時定義了 __wakeup()
方法時,才會調用 __serialize()
和 __unserialize()
方法。
__invoke()
方法
__invoke()
魔術方法是在嘗試將對象像函數一樣調用時調用的特殊方法。讓我們先看看它是如何工作的,然後再看看這個魔術方法的用途。
<?php class Student { private $name; private $email; public function __construct($name, $email) { $this->name = $name; $this->email = $email; } public function __invoke() { echo 'Student 对象被当作函数调用!'; } } $objStudent = new Student('John', 'john@tutsplus.com'); $objStudent(); ?>
如您所見,$objStudent
對像被視為函數,由於我們已定義了 __invoke()
方法,它將被調用,而不是返回錯誤。 __invoke()
方法的主要用途是,如果您想將對象視為可調用的,則可以實現此方法。
__clone()
方法
如果您想複製現有對象,可以使用 clone
關鍵字。但在克隆之後,如果您想修改克隆對象的屬性,可以在您的類中定義 __clone()
魔術方法。
<?php Class Student_School {} class Student { private $name; private $email; private $object_student_school; public function __construct() { $this->object_student_school = new Student_School(); } public function __clone() { $this->object_student_school = clone $this->object_student_school; } } $objStudentOne = new Student(); $objStudentTwo = clone $objStudentOne; ?>
上述方法的問題在於它在克隆時創建對象的淺拷貝,因此克隆對象的內部對像不會被克隆。
在上述示例中,如果您沒有定義 __clone()
方法,克隆對象 $objStudentTwo
將仍然指向 $objStudentOne
對象引用的同一個 Student_School
對象。因此,通過實現 __clone()
方法,我們確保 Student_School
對象與主對像一起被克隆。
__debugInfo()
方法
__debugInfo()
魔術方法在嘗試使用 var_dump()
函數轉儲對象時被調用。如果您沒有在類中定義此方法,它將轉儲所有公共、私有和受保護的屬性。因此,如果您想限制轉儲時顯示的信息,可以使用此方法。
<?php class Student { private $name; private $email; private $phone; private $db_connection_link; public function __construct($name, $email, $phone) { $this->name = $name; $this->email = $email; $this->phone = $phone; } public function __serialize() { return ['name' => $this->name, 'email' => $this->email, 'mobile' => $this->phone]; } public function __wakeup($data) { $this->name = $data['name']; $this->email = $data['email']; $this->phone = $data['mobile']; $this->db_connection_link = your_db_connection_function(); } } ?>
此方法應返回鍵值對數組,這些鍵值對將在 var_dump()
函數在對像上調用時顯示。如您所見,您可以完全控制在使用 var_dump()
函數轉儲對象時想要顯示的內容。
__set_state()
方法
__set_state()
方法是一個靜態方法,與 var_export()
函數一起使用。 var_export()
函數輸出關於變量的結構化信息。當您使用此函數導出類時,需要在類中定義 __set_state()
方法。
<?php class Student { private $name; private $email; public function __construct($name, $email) { $this->name = $name; $this->email = $email; } public function __invoke() { echo 'Student 对象被当作函数调用!'; } } $objStudent = new Student('John', 'john@tutsplus.com'); $objStudent(); ?>
如您所見,導出的字符串是有效的 PHP 代碼,您可以使用它來恢復原始對象。
總結
本文介紹了 PHP 中所有可用的魔術方法。對於每種方法,我都提供了一個簡短但有意義的示例,這應該有助於您理解其用途。我希望您可以將本文用作日常 PHP 開發中的快速參考或速查表。
本文已更新,並包含來自 Monty Shokeen 的貢獻。 Monty 是一位全棧開發者,他也喜歡編寫教程和學習新的 JavaScript 庫。
以上是php魔法方法作弊表的詳細內容。更多資訊請關注PHP中文網其他相關文章!