今天朋友面试遇到的问题: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属性不会被序列化
因项目需要需要统计用户无限下级计算分销佣金,计算每月分红,计算无限下级团队的业绩,需要先获得某个会员的无限下级成员。先看看数据库中的member表字段id username &...
使用php函数array_multisort()即可实现和SQL一样的order by排序. 例如我们需要对会员表按照主键降序排列,年龄升序排列://会员表数据 $list = []; $list[] = ['mid' =>&n...
(1).学习目标: 了解常见信号类型(百度PHP支持的信号类型),(2).相关函数学习: (2.1).pcntl_signal函数用于设置一个信号管理器接收进程信号,参数1:信号类型,参数2:回调函数,用于在接收到参数1类型的信...
将jsonp转为PHP数组和对象。/** * jsonp转数组|Jsonp转json * @param string $jsonp jsonp字符串 * @param bool $as...
为什么使用队列?因为pop取队列具有原子性。假如我们需要秒杀一个商品id,我们先将商品的库存保存到一个队列。例如:<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6...
//设置客户端断开依然运行 ignore_user_abort(true); //设置脚本不超时 set_time_limit(0); //死循环每隔1秒访问一次网址 while (true) { sleep(1); &nb...