【php類與對象】魔術方法

來源:互聯網
上載者:User

本篇文章給大家分享的內容是關於【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 '類被當成字串時tostring返回字串';        // return intval('tostring傳回值的內容不為字串');//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()

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.