当前位置: 首页 > article >正文

PHP__sleep和__wakeup有什么区别

在PHP中,__sleep__wakeup 是两个魔术方法(Magic Methods),它们与对象的序列化和反序列化过程紧密相关。这两个方法允许开发者在对象被序列化(存储或传输)和反序列化(恢复)时执行自定义的代码。

__sleep

__sleep 方法在对象被序列化之前自动调用。它的主要目的是返回一个包含对象中所有应被序列化的属性名称的数组。如果某个属性不需要被序列化,那么它就不应该出现在这个数组中。

public function __sleep(): array  
{  
    return ['property1', 'property2', /* ... */];  
}

如果 __sleep 方法没有返回任何数组(即返回空数组或者没有返回值),那么PHP将尝试序列化对象中的所有公共属性。如果方法抛出异常,则序列化过程将失败。

__wakeup

__wakeup 方法在对象被反序列化之后自动调用。它的主要目的是重新建立对象可能需要的任何资源,比如数据库连接、文件句柄等,因为这些资源在序列化过程中是不会被保存的。

public function __wakeup()  
{  
    // 重新建立资源或执行其他必要的初始化操作  
}

区别与用途

  • 调用时机__sleep 在序列化之前调用,而 __wakeup 在反序列化之后调用。
  • 目的__sleep 用于指定哪些属性应该被序列化,而 __wakeup 用于在反序列化后恢复对象的状态或重新建立资源。
  • 返回值__sleep 必须返回一个数组,而 __wakeup 不需要返回任何值。
  • 异常处理:如果 __sleep 抛出异常,序列化将失败;如果 __wakeup 抛出异常,它通常会在反序列化后的代码中更早地显现出来,因为反序列化操作本身通常不会捕获这些异常。

示例

下面是一个简单的示例,展示了如何使用 __sleep__wakeup

class MyClass {  
    public $property1;  
    private $property2;  
    private $databaseConnection;  
  
    public function __construct($property1, $property2) {  
        $this->property1 = $property1;  
        $this->property2 = $property2;  
        // 假设这里建立了数据库连接  
        $this->databaseConnection = new PDO(/* ... */);  
    }  
  
    public function __sleep(): array {  
        // 只序列化 property1 和 property2,不序列化数据库连接  
        return ['property1', 'property2'];  
    }  
  
    public function __wakeup() {  
        // 在反序列化后重新建立数据库连接  
        $this->databaseConnection = new PDO(/* ... */);  
    }  
}  
  
// 序列化对象  
$obj = new MyClass('value1', 'value2');  
$serialized = serialize($obj);  
  
// 反序列化对象  
$obj2 = unserialize($serialized);

在这个示例中,__sleep 方法确保了只有 $property1$property2 被序列化,而数据库连接则不会被序列化。然后,在反序列化后,__wakeup 方法负责重新建立数据库连接。


http://www.kler.cn/news/332866.html

相关文章:

  • 时间相关数据的统计分析(笔记更新中)
  • 我为什么决定关闭ChatGPT的记忆功能?
  • Java高效编程(16):在公共类中使用访问器方法,而不是公共字段
  • C++入门基础知识99——【关于C++ 成员运算符】
  • [C/C++开发]链接动态库在不同操作系统上的行为
  • 数据结构--二叉树的顺序实现(堆实现)
  • 移动技术开发:音乐播放器
  • 代码随想录 99. 岛屿数量
  • Studying-多线程学习Part2 - 互斥量死锁、lock_guard 与 unique_lock、call_once与其使用场景
  • Git介绍--github/gitee/gitlab使用
  • VMware tools菜单为灰色无法安装
  • 【MySQL 08】复合查询
  • 51单片机——矩阵键盘
  • 整理Maven坐标,Spring Boot集成工具依赖版本差异问题
  • JAVA基础语法 Day11
  • Pikachu-RCE-exec“ping“
  • 简单易懂的springboot整合Camunda 7工作流入门教程
  • 数据看板如何提升决策效率?
  • 订阅ROS2中相机的相关话题并保存RGB、深度和点云图
  • 【网络】web1.0 2.0 3.0各自出现背景/技术原理/演化发展过程,以及Web 3.0 对传统互联网的影响