前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP中对象的序列化和反序列化

PHP中对象的序列化和反序列化

作者头像
宣言言言
发布2019-12-18 16:41:07
1.3K0
发布2019-12-18 16:41:07
举报
文章被收录于专栏:宣言(Siam)博客宣言(Siam)博客

php的serialize函数和unserialize函数

serialize() 返回字符串,可以存储于任何地方。

serialize() 可处理除了 resource 之外的任何类型。甚至可以 serialize() 那些包含了指向其自身引用的数组。

这有利于存储或传递 PHP 的值,同时不丢失其类型和结构

在需要恢复的地方使用unserialize()函数即可

php类魔术方法中的__sleep和__wakeup

在众多的php类魔术方法中(另一篇文章有简单介绍 PHP类,魔术方法),有两个是跟序列化有关的。

__sleep() 在对象被调用serialize时隐式唤起,可以返回需要参与序列化的属性数组 __wakeup() 当调用unserialize恢复对象的时候,会被隐式唤起,可以做一些初始化工作

简单实战

假设,我们在cli模式的php程序,会根据调用命令解析到不同的类执行。

该类拥有以下3个属性,其中isDev,isCli应该根据运行入口、配置文件等状态而决定。

所以当我们在序列化该类的对象时,不应该包含这两个属性,而应该在wakeup的时候,动态取配置文件的值然后设置进去。

代码语言:javascript
复制
class Command{
    public $name;  // 命令名
    public $isDev; // 是否为开发环境
    public $isCli; // 是否为命令行运行

    public function run()
    {
        if ($this->isDev){
            echo "debug\n";
        }
        if (!$this->cli){
            echo "only cli\n";
        }
    }

    // 设置规定参与序列化的属性
    public function __sleep()
    {
        return ['name'];    
    }

    public function __wakeup()
    {
        // 从配置文件读取
        $config = file_get_content("siam.conf");
        $this->isDev = $config['dev'] ?? true;
        // 运行环境判断
        $this->isCli = true;
    }
}

实例化对象 并序列化

代码语言:javascript
复制
$class = new Command();
$class->isDev = true;
$class->isCli = true;
$str =  serialize($class);

var_dump(unserialize($str));
// 得到以下对象,isDev不会序列化原始的对象属性,而是通过wakeup重新定义
// object(Command)#3 (3) { ["name"]=> NULL ["isDev"]=> bool(false) ["isCli"]=> bool(true) }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.08.12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • php的serialize函数和unserialize函数
  • php类魔术方法中的__sleep和__wakeup
  • 简单实战
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档