当前位置:首页 > PHP > 正文内容

php __sleep,php阻止一个类被序列化,php __sleep作用

高老师5年前 (2020-07-14)PHP1507

今天朋友面试遇到的问题:php如何阻止一个类被序列化,首先我想到的是使用serialize函数进行序列化对象首先会检查对象是否存在__sleep方法,如果有的话先调用__sleep方法。

(1).普通序列化对象代码:

class member
{
    /**
     * 年龄
     * @var int
     */
    private $age = 26;

    /**
     * 姓名
     * @var string
     */
    private $name = '高久峰';
}

$member = new Member();
$text = serialize($member);
var_dump($text);

(2).通过类中增加__sleep方法阻止对象被序列化

class member
{
    /**
     * 年龄
     * @var int
     */
    private $age = 26;

    /**
     * 姓名
     * @var string
     */
    private $name = '高久峰';

    /**
     * @throws Exception
     */
    public function __sleep()
    {
        throw new \Exception('this class not support serialize');
    }
}

$member = new Member();
$text = serialize($member);
var_dump($text);

现在如果序列化会抛出异常阻止

(3).__sleep的作用是可以自定义返回需要序列化的字段,如果我们的对象属性比较多,但是我们不需要全部序列化保存,可以自定义,例如

class member
{
    /**
     * 年龄
     * @var int
     */
    private $age = 26;

    /**
     * 姓名
     * @var string
     */
    private $name = '高久峰';

    /**
     * 过滤类属性
     */
    public function __sleep()
    {
        return ['age'];
    }
}

$member = new Member();
$text = serialize($member);
var_dump($text);

这样序列化只能序列化age属性,name属性不会被序列化

扫描二维码推送至手机访问。

版权声明:本文由高久峰个人博客发布,如需转载请注明出处。

本文链接:https://blog.20230611.cn/post/143.html

分享给朋友:

“php __sleep,php阻止一个类被序列化,php __sleep作用” 的相关文章

php多进程,php多进程处理任务,php多进程应用场景

php多进程,php多进程处理任务,php多进程应用场景

php多进程应用场景主要是非web端,fpm下是不支持多进程的,非类linux操作系统都不支持,请在cli模式使用.可以使用多进程做任务分发,批量计算,批量文件处理,批量爬虫,网络运维等等。下面看一份简单的入门demo//创建子进程 $pid=pcntl_fork(); //返回-1,创建失败,不...

php迭代器学习

php迭代器学习

php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

【一】PHP多进程学习-简单创建父子进程.理解父子进程运行流程

(1).学习的目标:学会创建父子进程,并且能够区分当前进程是父还是子;了解父进程执行过程,子进程执行过程;能够用多进程执行任务(2).相关函数学习:    (2.1)pcntl_fork()执行时:       &nbs...

cookie跨域,cookie p3p跨域

cookie跨域,cookie p3p跨域

最近在公司开发一个新的项目假设项目域名是a.com,需要接入b.com的单点登陆系统。(1).首先我们会在a.com的登陆页面用iframe引入b.com来显示登陆界面,实际上登陆验证操作都是在b.com上面(2).当b.com验证通过,会在前端ajax请求a.com的回调地址,这个回调地址目的就是...

php通过event扩展创建定时器,php毫秒级定时器

php通过event扩展创建定时器,php毫秒级定时器

PHP简单定时器可以通过pcntl_signal创建闹钟信号来实现。但是缺点很明显,性能一般,要自己实现守护进程,不支持毫秒级定时器,单进程不支持多个闹钟信号,不能跨平台运行event扩展支持的事件多,性能高。<?php //创建event配置.[空配置] $eventConfig ...

php迭代器返回值,php yield getReturn

php迭代器返回值,php yield getReturn

php生成器的方法getReturn获取生成器迭代完成后的返回值,当生成器迭代完成会将生成器的返回值返回,因此如果迭代器未进行迭代是获取不到值的,如果你没有return值则返回null,参考代码:<?php function G1() {    &nbs...