专栏首页宣言(Siam)博客PHP中对象的序列化和反序列化

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

php的serialize函数和unserialize函数

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

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

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

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

php类魔术方法中的__sleep和__wakeup

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

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

简单实战

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

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

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

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;
    }
}

实例化对象 并序列化

$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) }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • php结合 Swoole的基本使用技巧

    这几个是定义帧定界的,因为Swoole的客户端和服务器端通信是TCP连接的,因此得给帧定界符,有多种帧定界方式,具体参考Swoole官方文档。这里其中是用头额外...

    php007
  • <object>标签

    <object> 标签(或者称作 HTML 嵌入对象元素)表示引入一个外部资源,这个资源可能是一张图片,一个嵌入的浏览上下文,亦或是一个插件所使用的资源。<ob...

    Html5知典
  • 布隆过滤器你值得拥有的开发利器

    在程序的世界中,布隆过滤器是程序员的一把利器,利用它可以快速地解决项目中一些比较棘手的问题。如网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透...

    semlinker
  • <iframe>标签

    <iframe> 标签(又称内联框架元素)表示了一个嵌套的浏览上下文(browsing context),实际上是用来在当前页面中内嵌另一个HTML页面。

    Html5知典
  • Laravel/Lumen 优化包 - 注解注入路由自动配置

    猿哥
  • 数据结构和算法——贝壳排序

    贝壳排序是插入排序的概括。与插入排序不同,它不比较连续项目,而是使用间隔i(称为间隔)将主列表分成几个子列表,然后使用插入排序对子列表进行排序。

    Lemon黄
  • AJAX-前后端交互的艺术

    当我们通过提交表单向服务器提交内容,或者进行一些其他操作,均涉及到了与浏览器之间的交互,传统的方式与AJAX方式的处理方法是不同的

    BWH_Steven
  • PHP Mysqli 常用代码集合

    PHP5.0开始,不仅可以使用早期的mysql数据库扩展函数,还能使用新扩展的mysqli技术实现与mysql数据库的信息交流,PHP的mysqli扩展被封装在...

    叫我可儿呀
  • php常量分为哪几种类型?

    所谓常量就是不能改变的量,php常量一旦被定义,就不能被改变或取消定义。这是官方的解释,也是最权威的解释。

    猿哥
  • web前端开发零基础学习知识

    互联网的快速发展和激烈竞争,用户体验成为一个重要的关注点,导致专业前端工程师成为热门职业,各大公司对前端工程师的需求量都很大,要求也越来越高,优秀的前端工程师更...

    千锋哈尔滨IT培训

扫码关注云+社区

领取腾讯云代金券