仓酷云

标题: PHP教程之Unserialize与Autoload [打印本页]

作者: 活着的死人    时间: 2015-2-3 23:31
标题: PHP教程之Unserialize与Autoload
到现在,对排版还是不很熟练,经常会排不好。    凡是是一个及格的PHP法式员,就应当晓得Unserialize与Autoload,然而要说起两者之间的关系,生怕一览无余的人就不多了。
  说个例子,假定咱们可以拿到第三方的序列化数据,但没有响应的类界说,代码以下:
  1. <?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了:
  1. <?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,例子以下:
  1. <?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,就悲催了,好比说上面这段代码:
  1. <?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出来:
  1. <?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); ?>
复制代码
不能不说,下面的代码真的很狗屎!那怎样做才好呢?我大致写了一个完成:
  1. <?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等网页基本元素,完成阶段可自行制作完整的网页,对元素属性达到熟悉程度
作者: 仓酷云    时间: 2015-2-4 01:05
学好程序语言,多些才是王道,写两个小时代码的作用绝对超过看一天书,这个我是深有体会(顺便还能练打字速度)。
作者: 活着的死人    时间: 2015-2-7 22:05
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 若天明    时间: 2015-2-21 21:27
首先声明:我是一个菜鸟,是一个初学者。学习了一段php后总是感觉自己没有提高,无奈。经过反思我认为我学习过程中存在很多问题,我改变了学习方法后自我感觉有了明显的进步。
作者: 小女巫    时间: 2015-3-6 21:56
建议加几个专业的phper的群,当然啦需要说话的人多,一处一点问题能有人回答你的,当然啦要让人回答你的问题,平时就得躲在里面聊天,大家混熟啦,愿意回答你问题的人自然就多啦。
作者: 愤怒的大鸟    时间: 2015-3-13 21:46
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 再现理想    时间: 2015-3-20 02:33
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者: 小魔女    时间: 2015-3-20 13:38
本文当是我的笔记啦,遇到的问题随时填充
作者: 简单生活    时间: 2015-3-25 06:01
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 分手快乐    时间: 2015-3-27 14:10
曾经犯过一个很低级的错误,我在文件命名的时候用了一个横线\\\\\\\'-\\\\\\\' 号,结果找了好几个小时的错误,事实是命名的时候 是不能用横线 \\\\\\\'-\\\\\\\' 的,应该用的是下划线  \\\\\\\'_\\\\\\\' ;
作者: 柔情似水    时间: 2015-3-28 02:50
php是动态网站开发的优秀语言,在学习的时候万万不能冒进。在系统的学习前,我认为不应该只是追求实现某种效果,因为即使你复制他人的代码调试成功,实现了你所期望的效果,你也不了解其中的原理。
作者: 山那边是海    时间: 2015-3-30 20:25
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 第二个灵魂    时间: 2015-4-10 18:57
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
作者: 只想知道    时间: 2015-4-15 03:33
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 变相怪杰    时间: 2015-5-8 05:04
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: 再见西城    时间: 2015-5-8 07:21
这些都是最基本最常用功能,我们这些菜鸟在系统学习后,可以先对这些功能深入研究。
作者: 蒙在股里    时间: 2015-5-11 16:35
开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。
作者: 若相依    时间: 2015-6-15 04:03
有位前辈曾经跟我说过,phper 至少要掌握200个函数 编起程序来才能顺畅点,那些不熟悉的函数记不住也要一拿手册就能找到。所以建议新手们没事就看看php的手册(至少array函数和string函数是要记牢的)。
作者: 谁可相欹    时间: 2015-6-19 17:04
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 深爱那片海    时间: 2015-6-21 21:42
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2