今天朋友面试遇到的问题: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属性不会被序列化
<?php //对比$this和self /* * $this更倾向于对象本身 * */ class Par{ public  ...
//参数1 文件名 参数2 缩放比例 function _thumb($_filename,$_percent){ ob_clean();...
【一】.抽象类假设如下场景:团队准备开发某网站,表建好了,页面设计好了.A组负责开发底层数据库操作类(DB),B组负责调用DB类.但是此时A组发生了争执,MySQL? Oracle? DB2? sqlite?到底使用什么数据库?B组.... 进入漫长的等待.解决方法:A组和B组 先定1个数据库类的模...
php官方的超全局变量$_SERVER['PHP_SELF']也能直接获取,只不过如果url参数太多也会获取。下面提供一个方法获取/* * 获取当前PHP文件名称 */ if (!function_exists('phpself...
逛公众号文章看到文章"php实现事件监听与触发的方法,你用过吗?",我就好奇了,php又不是asp.net的webform,哪里来的服务端事件监听。于是学习了一波。先看下监听类:class Event { /** &nbs...
<?php /** * daemonize让当前脚本为守护进程执行 * @param string $callback 匿名函数 */ function daemonize($callback) {...