【php類別與對象】魔術方法

不言
發布: 2023-03-23 20:54:01
原創
1609 人瀏覽過

本篇文章給大家分享的內容是關於【php類別與物件】魔術方法,有著一定的參考價值,有需要的朋友可以參考一下

魔術方法( Magic methods )

__construct()__destruct()__callStatic()__set()__isset()__unset()__wakeup()__invoke()__clone() __debugInfo()
登入後複製

__sleep() 和__wakeup()

public array __sleep ( void )void __wakeup ( void )
登入後複製

__sleep()作用於提交未提交的數據,或類似的清理操作。例如有一些很大的對象,但不需要全部保存。

__wakeup() 作用於反序列化運算。例如重新建立資料庫連接,或執行其它初始化操作。

serialize()會檢查類別中是否存在一個魔術方法 __sleep()。如果存在,該方法會先被調用,然後再執行序列化操作。此功能可用於清理對象,並傳回一個包含對像中所有應被序列化的變數名稱的陣列。如果該方法未傳回任何內容,則 NULL 會序列化,並產生一個 E_NOTICE 等級的錯誤。

unserialize() 會檢查是否有一個 __wakeup() 方法。如果存在,則會先呼叫 __wakeup 方法,預先準備物件所需的資源。


以上概念的解釋

序列化serialize可以把變數包含物件,轉換成連續bytes資料. 你可以將串列化後的變數存在一個檔案或在網路上傳輸. 然後再反串行化還原為原來的數據. 你在反串行化類的對象之前定義的類,PHP可以成功地存儲其對象的屬性和方法. 有時你可能需要一個對像在反串列化後立即執行. 為了這樣的目的,PHP會自動尋找__sleep和__wakeup方法.

#當一個對像被串行化,PHP會調用__sleep方法(如果存在的話). 在反串列化一個物件後,PHP 會呼叫__wakeup方法. 這兩個方法都不接受參數. __sleep方法必須傳回一個陣列,包含需要串列化的屬性. PHP會拋棄其它屬性的值. 如果沒有_ _sleep方法,PHP將保存所有屬性.

在程式執行前,serialize() 函數會先檢查是否存在一個魔術方法__sleep.如果存在,__sleep()方法會先被調用,然後才執行串行化(序列化)操作。這個函數可以用來清理對象,並傳回一個包含對像中所有變數名稱的陣列。如果該方法不回傳任何內容,則NULL被序列化,導致 一個E_NOTICE錯誤。與之相反,unserialize()會檢查是否有一個__wakeup方法。如果存在,則會先呼叫 __wakeup方法,預先準備物件資料。

__sleep方法常用於提交未提交的數據,或類似的操作。同時,如果你有一些很大的對象, 不需要保存,這個功能就很好用。 __wakeup經常用在反序列化操作中,例如重新建立資料庫連接,或執行其它初始化操作。


__toString()

用於一個類別被當成字串時應怎樣回應。例如 echo $obj; 應該顯示些什麼。
此方法必須傳回字串,否則將發出一個 E_RECOVERABLE_ERROR 等級的致命錯誤。不能在 __toString() 方法中拋出異常。這麼做會導致致命錯誤。

Example #2 简单示例<?php// Declare a simple classclass TestClass{
    public function __toString() {
        return &#39;类被当成字符串时tostring返回字符串&#39;;        // return intval(&#39;tostring返回值的内容不为字符串&#39;);//Recoverable fatal error: Method TestClass::__toString() must return a string value
    }
}$class = new TestClass();echo $class;//echo (string)$class; // 未定义 __toString()方法,并将对象转换为字符串,报错Recoverable fatal error: Object of class TestClass could not be converted to string?>
登入後複製

需要指出的是
在PHP 5.2.0 之前,__toString() 方法只有在直接使用於 echo 或 print 時才能生效。
PHP 5.2.0 之後,則可以在任何字串環境生效(例如透過 printf(),使用 %s 修飾符),但不能用於非字串環境(如使用 %d 修飾符)。
自 PHP 5.2.0 起,如果將一個未定義 __toString() 方法的物件轉換為字串,會產生 E_RECOVERABLE_ERROR 等級的錯誤。


__invoke()

mixed __invoke ([ $... ] )
登入後複製

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

Example #3 使用 __invoke()<?phpclass CallableClass {
    function __invoke($x) {
        var_dump($x);    //int(5)
    }
}$obj = new CallableClass;$obj(5);
var_dump(is_callable($obj));   //bool(true)?>
登入後複製

__set_state()

相關建議:

【php類別與物件】遍歷

【php類別與物件】匿名類別

#【php類別與物件】重載

#######

以上是【php類別與對象】魔術方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!