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

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

高老师6年前 (2020-07-14)PHP1663

今天朋友面试遇到的问题: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作用” 的相关文章

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 yield  PHP协程,PHP协程用法学习

PHP yield PHP协程,PHP协程用法学习

【一】.迭代器迭代是指反复执行一个过程,每执行一次叫做一次迭代。比如下面的代码就叫做迭代:1.  <?php   2.  $data = ['1', '2', &...

PHP最快方式模拟curl,PHP最快爬虫模拟方法

PHP最快方式模拟curl,PHP最快爬虫模拟方法

有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...

php爬虫执行js,php执行js

php爬虫执行js,php执行js

当我们使用php爬虫采集网站时经常会遇到内容使用ajax异步加载。一般采取的方案是PHP模拟再请求api接口获取数据,但是有时候前端js加密非常麻烦,我们需要将js的加密方法转换为php方法方便curl请求。当然通过了解我们可以通过3种方案解决。第一种:使用phpv8js扩展执行js代码。(pecl...

php redis队列实现秒杀 , php用redis 实现秒杀功能

php redis队列实现秒杀 , php用redis 实现秒杀功能

为什么使用队列?因为pop取队列具有原子性。假如我们需要秒杀一个商品id,我们先将商品的库存保存到一个队列。例如:<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6...

php关闭浏览器继续运行

php关闭浏览器继续运行

//设置客户端断开依然运行 ignore_user_abort(true); //设置脚本不超时 set_time_limit(0); //死循环每隔1秒访问一次网址 while (true) {     sleep(1);  &nb...