今天朋友面试遇到的问题: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属性不会被序列化
项目需要使用websocket推送最新订单,客户服务器非linux不支持swoole,因此使用原生,直接上代码(1).PHP服务端<?php ini_set('error_reporting', E_ALL ^ E_NOTICE); ini_set...
php官方已经提供了Iterator(迭代器)接口,通过网上资料的学习,目前看适合超大集合或者数组提取使用。学习一个函数的实现对比内存占用差距.使用迭代器和普通循环实现range()函数。(1).普通循环实现range()函数。function newrange($low, $h...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpa...
【一】.迭代器迭代是指反复执行一个过程,每执行一次叫做一次迭代。比如下面的代码就叫做迭代:1. <?php 2. $data = ['1', '2', &...
当我想在一个进程中监听kill 和 kill -9命令报了这个错误。//监听kill pcntl_signal(SIGTERM, function () { posix_kill(0, SIGTERM); });...