今天朋友面试遇到的问题: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 //高先生简单验证码. //随机数 //为什么循环0-15的数字 //因为要实现最简单的字母和数字混搭 //16进制0-9 a-f //dechex 十进制转换为16进制 //创建一个四位的验证码. //$nmsg.  ...
php官方的超全局变量$_SERVER['PHP_SELF']也能直接获取,只不过如果url参数太多也会获取。下面提供一个方法获取/* * 获取当前PHP文件名称 */ if (!function_exists('phpself...
PHP不像net支持多继承,自身只支持单继承,为了解决这个问题,php出了Trait这个特性,减少单继承语言的限制。并且能让代码复用率更高。说白了就是一个对象的属性和方法扩展工具一样。例如:trait exts { public f...
php arrayaccess 官方的说法是让你能以数组的形式访问对象,对于这种php内置接口一直不太明白有什么用,坚持多看文章,终于理解,特来分享,思路不同,更易于理解。(1).创建一个学生类,并且实现arrayaccess 接口。<?php class studen...
(1).前端文件:<form action="upload.php" method="post" enctype="multipart/form-data"> &...
面试中PHP面试官会问调用一个不存在的方法,如何知道是哪个文件哪行调用的?假设方法是getWorkLoad()回答1:开启PHP错误输出,PHP会输出Fatal error: Call to undefined function getWorkLoad() in D:\wwwroot\thinkpa...