在 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 ?。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。