今天朋友面试遇到的问题: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属性不会被序列化