仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1501|回复: 19
打印 上一主题 下一主题

[学习教程] PHP教程之Unserialize与Autoload

[复制链接]
活着的死人 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-2-3 23:31:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 13:30

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表