FireFox 3.0正式版开始提供下载
[ 2008/06/18 09:47 | by selboo ]
期待已久的 FireFox 3 正式版已经可以下载了,日前还只有源码包提供下载。在 2008-6-17 7:03:00 mozilla.org 的 FTP 里已经多了一个 3.0 目录,可以肯定 FireFox 3.0 的正式版已经可以下载了。
下载 FireFox 3.0 Linux 简体中文版
下载 FireFox 3.0 Linux 繁体中文版

FireFox中文官网已经提供FireFox3的下载链接

经过测试,最后已经显示火狐版本为3.0
Windwos版本下载点击
下载 FireFox 3.0 Linux 简体中文版
下载 FireFox 3.0 Linux 繁体中文版

FireFox中文官网已经提供FireFox3的下载链接

经过测试,最后已经显示火狐版本为3.0
Windwos版本下载点击
如何花少的时间学习更多的知识
[ 2008/06/18 09:37 | by selboo ]
原文:How to Learn More and Study Less - Scott Young | 翻译:常想一二
花时间学习不见得就是真正的学习。因为你的学习方法一开始就是错的话,那么花再多的时间在学习上也是无济于事。所以你得看看这篇文章,如何花少量的时间却仍然学习到更多的知识。
* 知识整合法
聪明人不仅是学习成绩优异,更重要的是有独到的学习方法。不像大多数学生凭记忆来求取好成绩,聪明的学生追求的是把知识串联起来构成一幅大的画面。这也就是我所说的知识整合法。
知识整合法与机械式学习截然相反,它讲究的是思想的连接而不是死记硬背每个知识点。比起让几何,代数和历史这些知识点在脑子里各据一处,你应该有意识的将这些知识联系到一起,从而构成一幅大的知识图。
额外的学习表明你没有用到知识整合法,而且不理解初学的知识。如果你能恰到好处的将知识点连接起来,那么学习就只是一次简短的对知识的更新罢了。
* 优化你的学习习惯
知识整合法不同于brainstorming或mind-mapping的技能,它从根本上改变了你对学习过程和吸收知识的理解。也就是说没我们不能依靠以往简单的十步骤来精通这种学习方法。
但是有一些工具能助你一臂之力,使你的学习习惯向具有整体性发展:
1. 让知识鲜活起来
你可能已经听过这种方法了。它指的是动员身体上所有的感官,知觉,用它们来传导知识。研究显示,当人们处在情绪饱满的状态下时,能接收更多鲜活、生动的信息。将知觉与想象灌入平淡的知识能让它们显得更加真实,从而方便我们理解接纳。还记得小时候用掰指头的方法来记数字吗?不妨在现在的学习中也试试这种方法吧。
2. 托物陈喻
知识整合法的核心就是将事物联系在一起。比喻本是一种文学手法用于联系两件看似不相干的个体到一起。这与知识整合法的核心不谋而合。用比喻将复杂的知识简化,以达到言简义丰的效用。
3. 十岁法则
用你对10岁小孩讲解知识的方式对自己解释知识。当然了,这种方法可能在你学医或者学习如何将神经系统运用到电脑智能中并不适用。不过重点是你要试着剥去那层复杂的外壳,让知识以最原始,最简单的形式呈现在我们面前。
4. “回到过去”
把课本拿开,开始随意的想一个概念,然后由它联想到之前学的某个概念,将这种思维方式持续下去直到你把很多的概念联系在一起。例如古普塔王朝让你想到了古希腊,进而联想到苏格拉底,再进一步想到孔夫子……
5. 漏洞扫描
仔细浏览课本,如果在某处发生记忆漏洞或对内容的不确定,一定要特别留意。立刻通过感官和比喻的方法将这个知识联系到之前存在于大脑中的知识。如果这种情况在一章节里出现多次,则表明你没有彻底理解这些知识。
6. 压缩信息
知识整合法不一定适用于所有信息。一个典型的事例便是在我学医第一年里学习解剖学时。学习解剖学,你需要记住身体上几百个不同部位的拉丁名称。这些名称通常没有清晰可辨的规律和构造,只是一个枯燥的列表。当你遇到这种情况时,应该尽量压缩这些信息,通过图片或记忆法来把它们划分成小块,方便记忆。
7. 准备动笔吧
拿出一张纸,把你想到的知识间的关联写在纸上。再重组这些知识以得到不同的。记住,关键是写的过程,亦是思考的过程,而不是最后的成品。所以不要浪费时间去美化你的思维图,只需用潦草的涂写和缩写构图就好了。
二进制转十进制,十进制转二进制的算法
[ 2008/06/17 09:25 | by selboo ]
来源:安全中国
二进制转十进制,十进制转二进制的算法
十进制转二进制:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写 就是结果
例如302
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
二进制转十进制
从最后一位开始算,依次列为第0、1、2...位
第n位的数(0或1)乘以2的n次方
得到的结果相加就是答案
例如:01101011.转十进制:
第0位:1乘2的0次方=1
1乘2的1次方=2
0乘2的2次方=0
1乘2的3次方=8
0乘2的4次方=0
1乘2的5次方=32
1乘2的6次方=64
0乘2的7次方=0
然后:1+2+0
+8+0+32+64+0=107.
二进制01101011=十进制107.
一、二进制数转换成十进制数
由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
二、十进制数转换为二进制数
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
1. 十进制整数转换为二进制整数
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
回答者:HackerKinsn - 试用期 一级 2-24 13:31
1.二进制与十进制的转换
(1)二进制转十进制
方法:"按权展开求和"
例:
(1011.01)2 =(1×23+0×22+1×21+1×20+0×2-1+1×2-2)10
=(8+0+2+1+0+0.25)10
=(11.25)10
(2)十进制转二进制
· 十进制整数转二进制数:"除以2取余,逆序输出"
例: (89)10=(1011001)2
2 89
2 44 …… 1
2 22 …… 0
2 11 …… 0
2 5 …… 1
2 2 …… 1
2 1 …… 0
0 …… 1
· 十进制小数转二进制数:"乘以2取整,顺序输出"
例:
(0.625)10= (0.101)2
0.625
X 2
1.25
X 2
0.5
X 2
1.0
2.八进制与二进制的转换
例:将八进制的37.416转换成二进制数:
37 . 4 1 6
011 111 .100 001 110
即:(37.416)8 =(11111.10000111)2
例:将二进制的10110.0011 转换成八进制:
0 1 0 1 1 0 . 0 0 1 1 0 0
2 6 . 1 4
即:(10110.011)2 =(26.14)8
3.十六进制与二进制的转换
例:将十六进制数5DF.9 转换成二进制:
5 D F . 9
0101 1101 1111.1001
即:(5DF.9)16 =(10111011111.1001)2
例:将二进制数1100001.111 转换成十六进制:
0110 0001 . 1110
6 1 . E
即:(1100001.111)2 =(61.E)16
二进制转十进制,十进制转二进制的算法
十进制转二进制:
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写 就是结果
例如302
302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
二进制转十进制
从最后一位开始算,依次列为第0、1、2...位
第n位的数(0或1)乘以2的n次方
得到的结果相加就是答案
例如:01101011.转十进制:
第0位:1乘2的0次方=1
1乘2的1次方=2
0乘2的2次方=0
1乘2的3次方=8
0乘2的4次方=0
1乘2的5次方=32
1乘2的6次方=64
0乘2的7次方=0
然后:1+2+0
+8+0+32+64+0=107.
二进制01101011=十进制107.
一、二进制数转换成十进制数
由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。这种做法称为"按权相加"法。
二、十进制数转换为二进制数
十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
1. 十进制整数转换为二进制整数
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
2.十进制小数转换为二进制小数
十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
回答者:HackerKinsn - 试用期 一级 2-24 13:31
1.二进制与十进制的转换
(1)二进制转十进制
方法:"按权展开求和"
例:
(1011.01)2 =(1×23+0×22+1×21+1×20+0×2-1+1×2-2)10
=(8+0+2+1+0+0.25)10
=(11.25)10
(2)十进制转二进制
· 十进制整数转二进制数:"除以2取余,逆序输出"
例: (89)10=(1011001)2
2 89
2 44 …… 1
2 22 …… 0
2 11 …… 0
2 5 …… 1
2 2 …… 1
2 1 …… 0
0 …… 1
· 十进制小数转二进制数:"乘以2取整,顺序输出"
例:
(0.625)10= (0.101)2
0.625
X 2
1.25
X 2
0.5
X 2
1.0
2.八进制与二进制的转换
例:将八进制的37.416转换成二进制数:
37 . 4 1 6
011 111 .100 001 110
即:(37.416)8 =(11111.10000111)2
例:将二进制的10110.0011 转换成八进制:
0 1 0 1 1 0 . 0 0 1 1 0 0
2 6 . 1 4
即:(10110.011)2 =(26.14)8
3.十六进制与二进制的转换
例:将十六进制数5DF.9 转换成二进制:
5 D F . 9
0101 1101 1111.1001
即:(5DF.9)16 =(10111011111.1001)2
例:将二进制数1100001.111 转换成十六进制:
0110 0001 . 1110
6 1 . E
即:(1100001.111)2 =(61.E)16
解析“肉鸡”电脑“商业价值”
[ 2008/06/17 09:24 | by selboo ]
来源:赛迪网 作者:李铁军
无知者也无畏,经常有人说,我不怕木马,我也没可啥可偷的,中毒就格式化。但就因对信息安全意识的淡薄,恰恰给攻击者带来无尽的肉鸡资源,同时,也会让自己付出惨重的代价却浑然不觉。本文讲述“肉鸡”电脑存在的“商业价值”,由此你可了解:为什么攻击者这样热衷于攻击普通人的电脑,把别人的电脑变成“肉鸡”。信息安全中提到的肉鸡,当然不是吃饱肚子的那种。
谁都不希望自己的电脑被他人控制,但是很多人的电脑是几乎不设防的,很容易被远程攻击者完全控制。你的电脑就因此成为别人砧板上的肉,别人想怎么吃就怎么吃,肉鸡(机)一名由此而来。
为什么攻击者热衷于获得他人电脑的控制权呢?控制别人的电脑,有什么用?他也搬不走,不还在我家里放着么,很多对电脑安全一无所知的人这样看。
本文试图用简单的描述,解释“肉鸡”的“商业价值”,了解这些,你就知道,一个陌生人的电脑对攻击者有多少诱惑。
1.盗窃“肉鸡”电脑的虚拟财产
虚拟财产有:网络游戏ID帐号装备、QQ号里的Q币、联众的虚拟荣誉值等等。虚拟财产,是可以兑现为真实货币的,多少不限,积累起来就是财富。
2.盗窃“肉鸡”电脑里的真实财产
真实财产包括:网上银行,大众版可以进行小额支付,一旦你的网银帐号被盗,最多见的就是要为别人的消费买单了。此外,还有网上炒股,证券大盗之类的木马不 少,攻击者可以轻易获得网上炒股的帐号,和银行交易不同的是,攻击者不能利用偷来的炒股帐号直接获益,这是由股票交易的特殊性决定的。不然,网上炒股一定会成为股民的噩梦。
相当多的普通电脑用户不敢使用网上银行,原因就是不了解该怎样保护网上银行的帐号安全。事实上,网上银行的安全性比网上炒股还要强很多,网上炒股则几乎是没有安全措施的。正确使用网上银行,安全性和便利性都是有保障的。
3.盗窃他人的隐私数据
陈冠希事件,相信大家都知道,如果普通人的隐密照片、文档被发布在互联网上,后果将同样十分严重。利用偷来的受害人隐私信息进行诈骗、勒索的案例不少见。
如果偷到受害人电脑上的商业信息,比如财务报表、人事档案,攻击者都可以谋取非法利益。还有相当一部分攻击者试图控制受害人的电脑摄像头,满足偷窥他人隐私的欲望。
4.可利用受害人的人脉关系获取非法利益
你或许认为你的QQ号无足轻重,也没QQ秀,也没Q币。实际上并非如此,你的QQ好友,你的Email联系人,手机联系人,都是攻击者的目标,攻击者可以伪装成你的身份进行各种不法活动,每个人的人脉关系都是有商业价值的。
最常见的例子就是12590业务利用偷来的QQ号群发垃圾消息骗钱,还有MSN病毒,自动给你的联系人发消息骗取非法利益。
5.在肉鸡电脑上种植流氓软件,自动点击广告获利
这种情况下,会影响你的上网体验,相信所有人都很讨厌电脑自动弹出的广告。攻击者在控制大量肉鸡之后,可以通过强行弹出广告,从广告主那里收获广告费,流氓软件泛滥的原因之一,就是很多企业购买流氓软件开发者的广告。
还有的攻击者,通过肉鸡电脑在后台偷偷点击广告获利,当然,受损的还是”肉鸡“电脑。当然,还有花了冤枉钱的广告主。他购买的广告,全被无效的机器点击给骗走了。
6.以肉鸡电脑为跳板(代理服务器)对其它电脑发起攻击
黑客的任何攻击行为都可能留下痕迹,为了更好的隐藏自己,必然要经过多次代理的跳转,肉鸡电脑充当了中介和替罪羊。攻击者为传播更多的木马,也许会把你的电脑当做木马下载站。网速快,机器性能好的电脑被用作代理服务器的可能性更大。
7.“肉鸡”电脑是发起DDoS攻击的马前卒
DDoS,你可以理解为网络黑帮或网络战争,战争的发起者是可以获取收益的,有人会收购这些网络打手。这些网络黑帮成员,也可以直接对目标主机进行攻击,然后敲诈勒索。“肉鸡”电脑,就是这些网络黑帮手里的一个棋子,DDoS攻击行为已经是网络毒瘤。
总之,“肉鸡”电脑是攻击者致富的源泉,在攻击者的圈子里,”肉鸡“电脑就象白菜一样被卖来卖去。在黑色产业链的高端,这些庞大”肉鸡“电脑群的控制者构筑了一个同样庞大又黑暗的木马帝国。
无知者也无畏,经常有人说,我不怕木马,我也没可啥可偷的,中毒就格式化。但就因对信息安全意识的淡薄,恰恰给攻击者带来无尽的肉鸡资源,同时,也会让自己付出惨重的代价却浑然不觉。本文讲述“肉鸡”电脑存在的“商业价值”,由此你可了解:为什么攻击者这样热衷于攻击普通人的电脑,把别人的电脑变成“肉鸡”。信息安全中提到的肉鸡,当然不是吃饱肚子的那种。
谁都不希望自己的电脑被他人控制,但是很多人的电脑是几乎不设防的,很容易被远程攻击者完全控制。你的电脑就因此成为别人砧板上的肉,别人想怎么吃就怎么吃,肉鸡(机)一名由此而来。
为什么攻击者热衷于获得他人电脑的控制权呢?控制别人的电脑,有什么用?他也搬不走,不还在我家里放着么,很多对电脑安全一无所知的人这样看。
本文试图用简单的描述,解释“肉鸡”的“商业价值”,了解这些,你就知道,一个陌生人的电脑对攻击者有多少诱惑。
1.盗窃“肉鸡”电脑的虚拟财产
虚拟财产有:网络游戏ID帐号装备、QQ号里的Q币、联众的虚拟荣誉值等等。虚拟财产,是可以兑现为真实货币的,多少不限,积累起来就是财富。
2.盗窃“肉鸡”电脑里的真实财产
真实财产包括:网上银行,大众版可以进行小额支付,一旦你的网银帐号被盗,最多见的就是要为别人的消费买单了。此外,还有网上炒股,证券大盗之类的木马不 少,攻击者可以轻易获得网上炒股的帐号,和银行交易不同的是,攻击者不能利用偷来的炒股帐号直接获益,这是由股票交易的特殊性决定的。不然,网上炒股一定会成为股民的噩梦。
相当多的普通电脑用户不敢使用网上银行,原因就是不了解该怎样保护网上银行的帐号安全。事实上,网上银行的安全性比网上炒股还要强很多,网上炒股则几乎是没有安全措施的。正确使用网上银行,安全性和便利性都是有保障的。
3.盗窃他人的隐私数据
陈冠希事件,相信大家都知道,如果普通人的隐密照片、文档被发布在互联网上,后果将同样十分严重。利用偷来的受害人隐私信息进行诈骗、勒索的案例不少见。
如果偷到受害人电脑上的商业信息,比如财务报表、人事档案,攻击者都可以谋取非法利益。还有相当一部分攻击者试图控制受害人的电脑摄像头,满足偷窥他人隐私的欲望。
4.可利用受害人的人脉关系获取非法利益
你或许认为你的QQ号无足轻重,也没QQ秀,也没Q币。实际上并非如此,你的QQ好友,你的Email联系人,手机联系人,都是攻击者的目标,攻击者可以伪装成你的身份进行各种不法活动,每个人的人脉关系都是有商业价值的。
最常见的例子就是12590业务利用偷来的QQ号群发垃圾消息骗钱,还有MSN病毒,自动给你的联系人发消息骗取非法利益。
5.在肉鸡电脑上种植流氓软件,自动点击广告获利
这种情况下,会影响你的上网体验,相信所有人都很讨厌电脑自动弹出的广告。攻击者在控制大量肉鸡之后,可以通过强行弹出广告,从广告主那里收获广告费,流氓软件泛滥的原因之一,就是很多企业购买流氓软件开发者的广告。
还有的攻击者,通过肉鸡电脑在后台偷偷点击广告获利,当然,受损的还是”肉鸡“电脑。当然,还有花了冤枉钱的广告主。他购买的广告,全被无效的机器点击给骗走了。
6.以肉鸡电脑为跳板(代理服务器)对其它电脑发起攻击
黑客的任何攻击行为都可能留下痕迹,为了更好的隐藏自己,必然要经过多次代理的跳转,肉鸡电脑充当了中介和替罪羊。攻击者为传播更多的木马,也许会把你的电脑当做木马下载站。网速快,机器性能好的电脑被用作代理服务器的可能性更大。
7.“肉鸡”电脑是发起DDoS攻击的马前卒
DDoS,你可以理解为网络黑帮或网络战争,战争的发起者是可以获取收益的,有人会收购这些网络打手。这些网络黑帮成员,也可以直接对目标主机进行攻击,然后敲诈勒索。“肉鸡”电脑,就是这些网络黑帮手里的一个棋子,DDoS攻击行为已经是网络毒瘤。
总之,“肉鸡”电脑是攻击者致富的源泉,在攻击者的圈子里,”肉鸡“电脑就象白菜一样被卖来卖去。在黑色产业链的高端,这些庞大”肉鸡“电脑群的控制者构筑了一个同样庞大又黑暗的木马帝国。
PHP的面向对象编程
[ 2008/06/13 11:23 | by selboo ]
综述
PHP的面向对象编程是进行项目开发时常用到的方法。本节我们将要介绍如何在PHP中进行面向对象编程(OOP,Object Oriented Programming),并说明如何通过使用一些OOP的概念和PHP的技巧来减少编码和提高质量。在应用PHP类前,请你查阅相关的面向对象编程书籍,了解面向对象及类的相关基础知识。
如何建立一个类及类的实例对象?
在PHP中通过类来完成封装,我们先看一个简单的例子:
class ClassName {
//定义数据成员用"var",数据成员可以是一个整数,一个数组,一个相关数组(associative array)或者是一个对象
var $value;
//方法在类中被定义成函数形式,在方法中访问类成员变量时,可以使用$this->name ,比如$this->setValue
function setValue($v) {
$this->value=$v;
}
function getValue() {
return $this->value;
}
}
//创建一个对象用"new"操作符
$obj=new ClassName;
$obj->setValue("Hello,PHP world!");
$obj->getValue();
?>
继承用"extend"关键字。例如:
class HelloPHPWorld extends ClassName {
var $message;
function setMessage($msg) {
$this->message=$msg;
}
function getMessage() {
return $this->message;
}
}
?>
"HelloPHPWorld"类的对象现在拥有了父类(ClassName)的全部的数据成员及方法,另外还有自已的数据成员和方法。
我们可以使用:
$obj2=new HelloPHPWorld;
$obj2->setValue("I love world!");
$obj2->setMessage("I love PHP!");
PHP现在还不支持多重继承,所以不能从两个或两个以上类派生出新的类来。
如何在派生类中重定义一个方法?
我们可以在派生类中重定义一个方法,如果我们在"HelloPHPWorld"类中重定义了getValue方法,我们就不能使用"ClassName"中的getValue方法了。如果我们在派生类中声明了一个与基派同名的数据成员,那么当我们处理它时,它将"隐藏"基类的数据成员。
如何在类中定义构造函数?
构造函数是一个与类名同名的方法,当创建一个类的对象时,该函数会被调用以用来初始化对象,例如定义一个类:
class ClassName {
var $value;
function ClassName($v) {
$this->value=$v;
}
function setValue($v) {
$this->value=$v;
}
function getValue() {
return $this->value;
}
}
?>
上例中,类中的成员函数ClassName即一个构造函数,现在我们可以这样创建对象:
$obj=new ClassName("Hello,PHP world!");
将参数传递给构造函数,构造函数则会自动地将"Hello,PHP world!"赋值给函数中的数据变量value。构造函数和方法都是普通的PHP函数,所以可以使用缺省参数。
function ClassName($k="welcome",$v="Hello,PHP world!")
接着:
$obj=new ClassName(); // $key="welcome",value="Hello,PHP world!"
$obj=new ClassName("I love PHP!"); // $key="welcome",value="I love PHP!"
$obj=new ClassName("First","I love PHP!"); // $key="First",value="I love PHP!"
缺省参数使用C++的方式,参数是从左到右赋值的,如果传入的参数少于要求的参数时,其余的将使用缺省参数。
当一个派生类的对象被创建时,只有它的构造函数被调用,父类的构造函数没被调用,如果你想调用基类的构造函数,你必须要在派生类的构造函数中显式调用。可以这样做是因为在派生类中所有父类的方法都是可用的。
function HelloPHPWorld() {
$this->message="Hello,PHP world!";
$this->ClassName();
//显式调用基类构造函数
}
?>
在PHP中没有标准的方法来实现抽象类,但是如果需要这个特性,可以通过定义基类,并在它的构造函数后加上"die" 的调用,这样就可以保证基类是不可实例化的,现在在每一个方法(接口)后面加上"die" 语句,所以,如果一个程序员在派生类中没有覆盖方法,将引发一个错误。而且因为PHP 是无类型的,所以可能需要确认一个对象是来自于基类的派生类,那么在基类中增加一个方法来实义类的身份(返回某种标识id),并且在接收到一个对象参数时校验这个值。
[下一页]
如何在PHP中实现析构函数功能?
在OOP中,我们可以重载一个方法来实现两个或重多的方法具有相同的名字,但是有不同数量或类型的参数(这要看语言)。PHP 是一种松散类型的语言,没有析构函数,所以通过类型重载或者通过参数的个数不同来重载也没有作用。
有时在OOP中重载构造函数非常好,这样可以通过不同的方法创建对象(传递不同数量的参数)。而在PHP中,怎么去实现同等的功能呢?技巧如下:
class Myclass {
function Myclass() {
$name="Myclass".func_num_args();
$this->$name();
//注意$this->name()一般是错误的,但是在这里$name是一个将被调用方法的名字
}
function Myclass1($x) {
……
}
function Myclass2($x,$y) {
……
}
}
?>
通过在类中的额外的处理,使用这个类对用户是透明的:
$obj1=new Myclass(''1''); //将调用Myclass1
$obj2=new Myclass(''1'',''2''); //将调用Myclass2
如何在PHP中应用多态性?
多态性在象PHP这样的解释语言是非常容易和自然的:
function niceDrawing($x) {
//假设这是Board类的一个方法
$x->draw();
}
$obj=new Circle(3,187);
$obj2=new Rectangle(4,5);
$board->niceDrawing($obj);
//将调用Circle的draw方法
$board->niceDrawing($obj2);
//将调用Rectangle的draw方法
?>
如何应用序列化(Serializing) 机制?
PHP不支持永久对象,而在OOP中永久对象是可以在多个应用的引用中保持状态和功能的对象,这意味着拥有将对象保存到一个文件或数据库中的能力,而且可以在以后装入对象。这就是所谓的序列化机制。PHP 拥有序列化方法,它可以通过对象进行调用,序列化方法可以返回对象的字符串表示。然而,序列化只保存了对象的成员数据而不包话方法。
例子 :
$obj=new Classfoo();
$str=serialize($obj);
//保存$str到磁盘上
//几个月以后
//从磁盘中装入str
$obj2=unserialize($str)
?>
恢复了成员数据,但是不包括方法。这导致了只能通过类似于使用$obj2->x来存取成员变量的唯一办法。
如何使用类进行数据存储?
对于PHP和OOP,可以很容易地定义一个类来操作某件事情,并且无论何时你想用的时候都可以调用相应的类。我们可以使用OOP或PHP来减少编码并提高质量。
定义一个产品的类,定义它应该有的方法(例如:显示),然后定义对每一种类型的产品的类,从产品类派后出来(SoundItem类,ViewableItem类,等等),覆盖在产品类中的方法,使它们按我们的预想运作。
根据数据库中每一种产品的类型(type)字段给类命名,一个典型的产品表可能有(id, type, price, description)等等字段,然后在处理脚本中,可以从数据库中取出type值,然后实例化一个名为type的对象:
$obj=new $type();
$obj->action();
?>
这是PHP的一个非常好的特性,不用考虑对象的类型,调用$obj的显示方法或其它的方法。不需要修改脚本去增加一个新类型的对象,只是增加一个处理它的类。
当创建一个$obj的对象时,可以通过$obj2=$obj来拷贝对象,新的对象是$obj的一个拷贝(不是一个引用),所以它具有$obj在当时的状态。有时候,只是想生成一个象obj类一样的一个新的对象,可以通过使用new语句来调用类的构造函数。在PHP中也可以通过序列化,和一个基类来实现,但所有的其它类都要从基类派生出来。
当序列化一个对象,会得到某种格式的字符串,其中,字符串中有类的名字,可以把它取出来,比如:
$herring=serialize($obj);
$vec=explode('':'',$herring);
$nam=str_replace("\"",'''',$vec[2]);
?>
所以假设创建了一个"Universe"的类,并且强制所有的类都必须从universe扩展,可以在universe中定义一个clone的方法,如下:
class Universe {
function clone() {
$herring=serialize($this);
$vec=explode('':'',$herring);
$nam=str_replace(""",'''',$vec[2]);
$ret=new $nam;
return $ret;
}
}
//然后
$obj=new Something();
//从Universe扩展
$other=$obj->clone();
?>
所得到的是一个新的Something类的对象,它同使用new方法,调用构造函数创建出的对象一样。