|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
到现在,对排版还是不很熟练,经常会排不好。 凡是是一个及格的PHP法式员,就应当晓得Unserialize与Autoload,然而要说起两者之间的关系,生怕一览无余的人就不多了。
说个例子,假定咱们可以拿到第三方的序列化数据,但没有响应的类界说,代码以下:
- <?php $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}'; $result = unserialize($string); var_dump($result); /* object(__PHP_Incomplete_Class)[1] public '__PHP_Incomplete_Class_Name' => string 'Foobar' (length=6) public 'foo' => string '1' (length=1) public 'bar' => string '2' (length=1) */ ?>
复制代码 当咱们反序列化一个对象时,假如对象的类界说不存在,那末PHP会引入一个未完成类的概念,即:__PHP_Incomplete_Class,此时固然咱们反序列化胜利了,但仍是没法会见对象中的数据,不然会呈现以下报错信息:
The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition.
这不是甚么难事儿,只需做一次强迫类型转换,酿成数组就OK了:
- <?php $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}'; $result = (array)unserialize($string); var_dump($result); /* array '__PHP_Incomplete_Class_Name' => string 'Foobar' (length=6) 'foo' => string '1' (length=1) 'bar' => string '2' (length=1) */ ?>
复制代码 不外假如体系激活了Autoload,情形会变得庞杂些。特地插句话:PHP其实供应了一个名为unserialize_callback_func设置装备摆设选项,但意思和autoload差不多,这里就不引见了,我们就说autoload,例子以下:
- <?php spl_autoload_register(function($name) { var_dump($name); }); $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}'; $result = (array)unserialize($string); var_dump($result); ?>
复制代码 履行下面代码会发明,spl_autoload_register被触发了,多半时分这是成心义的,但假如碰到一个界说不妥的spl_autoload_register,就悲催了,好比说上面这段代码:
- <?php spl_autoload_register(function($name) { include "/path/to/{$name}.php"; }); $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}'; $result = (array)unserialize($string); var_dump($result); ?>
复制代码 毫无疑问,由于找不到类界说文件,所以报错了!改改spl_autoload_register一定行,但条件是你能改,假如触及第三方代码,咱们就不克不及私自做主了,此时咱们需求一种办法让unserialize能绕开autoload,最复杂的办法是把咱们需求的类FAKE出来:
- <?php spl_autoload_register(function($name) { include "/path/to/{$name}.php"; }); class Foobar {} // Oh, Shit! $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}'; $result = (array)unserialize($string); var_dump($result); ?>
复制代码 不能不说,下面的代码真的很狗屎!那怎样做才好呢?我大致写了一个完成:
- <?php spl_autoload_register(function($name) { include "/path/to/{$name}.php"; }); $string = 'O:6:"Foobar":2:{s:3:"foo";s:1:"1";s:3:"bar";s:1:"2";}'; $functions = spl_autoload_functions(); foreach ($functions as $function) { spl_autoload_unregister($function); } $result = (array)unserialize($string); foreach ($functions as $function) { spl_autoload_register($function); } var_dump($result); ?>
复制代码 代码固然多了点,但最少没有FAKE类,看上去恬逸多了。
熟悉HTML/CSS/JS等网页基本元素,完成阶段可自行制作完整的网页,对元素属性达到熟悉程度 |
|