在 PHP 中, __sleep 和 __wakeup 方法被稱為 magic methods 。當我們想要在運行時處理對象的序列化和反序列化時,會調用或執行這些方法,以字符串格式存儲或保存對象信息並再次恢複該信息。
__sleep()方法:該方法用於序列化。序列化用於將對象的信息以字符串表示形式保存或存儲在數據庫、cookie、服務器、會話、文件等中。該方法返回一個包含對象屬性的數組,包含在序列化版本中那個特定的物體。通常在啟動對象序列化之前調用此方法,它告訴字符串表示形式中要包含哪些屬性。換句話說,the__sleep()方法提供了一種將類實例的信息(即變量、方法等)以字符串格式保存在文件或任何其他提到的位置或路徑中的方法。
用法:
public function __sleep() { return statement (object) }
示例 1:在此示例中,我們在 __construct() 方法中聲明數組並初始化值。在__sleep()方法中,返回數組值,它隻會以字符串的形式存儲對象信息。要調用此 __sleep() 方法,請為該類創建一個對象並序列化該對象,以便調用 __sleep() 方法。它隻會在輸出中以字符串的形式顯示數組信息。
PHP
<?php
class Sleep_Wakeup {
public $arrayM;
public function __construct() {
$this->arrayM = array(1, 2, 3, 4, 5);
}
public function __sleep() {
echo "I am from __sleep() method \n";
return array('arrayM');
}
}
$obj = new Sleep_Wakeup();
$serializedStr = serialize($obj); //serializing the object
var_dump($serializedStr); //printing the serialized object
?>
輸出:
I am from __sleep() method string(83) "O:12:"Sleep_Wakeup":1:{s:6:"arrayM";a:5:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;}}"
__wakeup()方法:該方法用於反序列化。反序列化用於將保存的字符串表示形式恢複為其原始形式。 De-Serialization 是序列化的反之亦然。 __wakeup()方法還用於提供初始化或調用各種資源,如數據庫、文件、服務器等,
用法:
public function __wakeup() { // Initializing the connection // to resources (file, database etc.,) }
示例 2:在此示例中,聲明資源變量。在__wakeup()方法中,提供打開文件的初始化,__wakeup()將打開該文件。要調用此 __wakeup() 方法,請為該類創建一個對象,並在反序列化之前先序列化該對象。現在,反序列化對象以調用__wakeup()方法。它將根據 __wakeup() 方法中的初始化簡單地調用文件或其他源。
PHP
<?php
class Sleep_Wakeup {
public $resource; //declaration
public function __wakeup() {
echo "I am from __wakeup() method \n";
// Opening the file
$this->resource = fopen("demo.txt", "w");
}
}
$obj = new Sleep_Wakeup();
// Serializing the object for string representation
$serializedStr = serialize($obj);
// Unserializing the string object
var_dump(unserialize($serializedStr));
?>
輸出
I am from __wakeup() method object(Sleep_Wakeup)#2 (1) { ["resource"]=> resource(5) of type (stream) }
__sleep() 方法和 __wakeup() 方法之間的區別:
S.No |
__sleep()方法 |
__wakeup()方法 |
---|---|---|
1 |
當我們想要序列化一個對象時使用它。 |
當我們想要de-serialize一個對象時調用它 |
2 |
serialize()方法在執行之前總是會檢查程序是否包含__sleep方法。 |
unserialize()方法在執行之前總是會檢查程序是否包含__wakeup方法。 |
3 |
它用於清理待處理的任務。 |
它用於重新建立數據庫或在序列化過程中丟失的任何其他連接。 |
4 |
它隻是清理對象並返回一個數組,其中包含序列化的類實例中存在的所有變量。 |
它隻是重新創建或重新構造我們想要的對象de-serialize。 |
5 |
如果代碼中存在 __sleep,則 serialize() 將始終首先調用 __sleep 方法。 |
如果代碼中存在 __wakeup,則 unserialize() 將始終首先調用 __wakeup 方法。 |
相關用法
- PHP Hebrev()用法及代碼示例
- PHP Max()用法及代碼示例
- PHP String htmlspecialchars()用法及代碼示例
- PHP String htmlspecialchars_decode()用法及代碼示例
- PHP String localeconv()用法及代碼示例
- PHP String nl2br()用法及代碼示例
- PHP String nl_langinfo()用法及代碼示例
- PHP String quoted_printable_decode()用法及代碼示例
- PHP String quoted_printable_encode()用法及代碼示例
- PHP String sprintf()用法及代碼示例
- PHP String sscanf()用法及代碼示例
- PHP String str_replace()用法及代碼示例
- PHP String strrpos()用法及代碼示例
- PHP String strspn()用法及代碼示例
- PHP String strstr()用法及代碼示例
- PHP String strtok()用法及代碼示例
- PHP String strtolower()用法及代碼示例
- PHP String strtoupper()用法及代碼示例
- PHP String strtr()用法及代碼示例
- PHP String substr()用法及代碼示例
- PHP String substr_compare()用法及代碼示例
- PHP String substr_count()用法及代碼示例
- PHP String substr_replace()用法及代碼示例
- PHP String ucfirst()用法及代碼示例
- PHP String ucwords()用法及代碼示例
注:本文由純淨天空篩選整理自rvk631ia4大神的英文原創作品 What is difference between __sleep and __wakeup() in PHP ?。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。