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

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

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

今天朋友面试遇到的问题: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获取原始数据

在项目中需要对图片进行裁剪,前端裁剪完成发送base64给后端,但是很意外的PHP获取到的数据和前端有点差距,之前我都是先加密,后端解密,但是这次依然不行。于是使用filter_input方法轻松解决。$base64 =  filter_input(INPUT_POST...

php soap 捕获异常,使用try catch 捕获Soap 异常

php soap 捕获异常,使用try catch 捕获Soap 异常

项目中使用服务来执行webservice,由于对方系统api不稳定,经常导致服务崩溃,只能重启,一个月差不多要重启一次。初期的解决办法是捕获异常,然后continue掉。<?php try {     $url = 'http...

php上传大文件,php大文件上传

php上传大文件,php大文件上传

(1).前端文件:<form action="upload.php" method="post" enctype="multipart/form-data">    &...

php finally使用

php finally使用

<?php /**  * @throws Exception  */ function curl() {     throw  new \Exception('err...

pcntl_signal(): Error assigning signal

pcntl_signal(): Error assigning signal

当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () {     posix_kill(0, SIGTERM); });...

posix_ttyname函数详解

posix_ttyname函数详解

posix_ttyname - 获取当前终端设备名称。<?php     var_dump( posix_ttyname(STDOUT) );我们启动一个终端,执行上面的代码输出:/dev/tty1我们再启动一个终端,执行上面的代码输...