今天朋友面试遇到的问题: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属性不会被序列化
本篇文章不是讲解如何用.net开发自己的dll然后PHP通过com调用。主要记录PHP官方支持的DOTNET 基本语法如下:$obj = new DOTNET("assembly", "classname")a...
应用场景:PHP模拟购买,商品数量大于0才能购买常见代码:<?php //连接数据库 $con=mysqli_connect("localhost","ihuohuo","927464cy","ihuohuo");...
在项目下的composer配置文件修改(PaySdk是我这里一个支付sdk的目录,包含各种各样的支付sdk,这样写的意思让composer自动把PaySdk下的所有文件自动加载):"autoload": { &...
php event扩展在windows中依赖于php_sockets扩展,因此在php.ini中必须先加载php sockets扩展,如下。extension=sockets extension=event...
文章篇幅较长,如果不喜欢看文章的,此处抛出韩顺丰老师的位运算视频,韩老师应该是全网讲php位运算符最详细的一个老师了。链接:https://pan.baidu.com/s/14xj7er8eVSUcJ-jYXyA0GA 提取码:731m 链接:https://pan.baidu.com...
//设置客户端断开依然运行 ignore_user_abort(true); //设置脚本不超时 set_time_limit(0); //死循环每隔1秒访问一次网址 while (true) { sleep(1); &nb...