首頁 >後端開發 >php教程 >php魔法方法作弊表

php魔法方法作弊表

William Shakespeare
William Shakespeare原創
2025-03-07 11:25:09595瀏覽

PHP Magic Methods Cheatsheet

本文提供一份 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中文網其他相關文章!

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