今天朋友面试遇到的问题: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 function go($str) { echo'I\'m '.$str; } $goto='go'; $goto('gaojiufeng'...
PHP验证码不显示的问题应该是经常的事情,我在这里把2种解决方案都发出来方便大家后期使用.因为是昨天晚上自己写验证码都没有显示,我就直接把之前和李炎恢老师上课写的验证码拿来还是不显示,醉了。首先是第一种方法:1、打开服务器安装目录下的php.ini文件;2、去掉;extension=php_gd.d...
PHP的session文件夹默认保存在同一个文件,随着访客的增多,访问的速度会非常慢,例如部分管理系统后台每天登陆1000次,1个月就创建了30000个session文件,一年后是多少?假设这个系统的用户是上万人呢?方法1:每个网站使用自己的session文件夹,代码如下:<?php $pat...
开启错误提示代码:ini_set("display_errors", "On"); error_reporting(E_ALL | E_STRICT);关闭错误提示代码:error_reporting(E_ALL ^&n...
ThinkPHP中有一个debug调试功能,能输出报错文件的信息,并能看到这个函数被哪些函数调用,从框架的启动开始记录,特别方便调试。于是研究了下它的底层给予了实现。<?php //--框架核心--Start //框架内置错误处理 function errDealWith($er...
重构框架的时候想要考虑支持下cli模式,于是参考了thinkphp的底层。/** * 获取应用根目录 * @return string */ public static function getRootP...