今天朋友面试遇到的问题: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...
首先看看以下代码:代码1:<?php $a=0.1; $b=0.7; if($a+$b==0.8) { echo "1"; } else{ echo "2"; } ?>代码2:<?php &n...
在使用ftok生成ipc进程通信key尝试将第二个参数项目标识符传入字符串报错:PHP Warning: ftok(): Project identifier is invalid,查阅资料发现第二个字符串只能是1个字符串,长度为1....
最近在编写windows php多线程的东西,从官网下载了PHP的线程安全版,尝试开启curl扩展extension=php_curl.dllphp -m 却提示 PHP Startup: Unable to load dynamic library 'C:\php\ext\php_curl...
有时候我们需要爬一个接口,但是这个接口需要很多参数,包括header和cookie要去编写,使用php curl模拟实在太慢。我们可以通过浏览器的network来复制请求为curl命令。例如我需要模拟请求接口地址:https://www.xkmz.cc/Ajax/Debug/delly,我们只需要在...
经常我们下载国外资源容易被墙,可以通过php脚本获取远程文件流然后输出给我们的浏览器来下载。<?php //设置下载文件的url $url = 'https://mirrors.huaweicloud.com/ubuntukylin/ubuntukylin-19....