<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>一根网线 整个人生 &#187; 互联网观察</title>
	<atom:link href="http://fugui.in/category/internet/feed" rel="self" type="application/rss+xml" />
	<link>http://fugui.in</link>
	<description>fugui.in是在美国注册的印度的域名用的新加坡的服务器的中国人的网站</description>
	<lastBuildDate>Sat, 04 Sep 2010 03:03:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>百度推广联盟开始使用邀请注册了</title>
		<link>http://fugui.in/799.aspx</link>
		<comments>http://fugui.in/799.aspx#comments</comments>
		<pubDate>Tue, 31 Aug 2010 03:01:43 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[百度联盟]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=799</guid>
		<description><![CDATA[有要申请的可以从这里申请，当然从这个链接进去，我会有提成的。 不过好像是邀请注册比直接注册通过率高一些。想注册百度推广的朋友可以试试。 邀请地址： http://union.baidu.com/regSearchUnion.jsp?invitedBy=uvw1uy7_]]></description>
			<content:encoded><![CDATA[<p>有要申请的可以从这里申请，当然从这个链接进去，我会有提成的。<br />
不过好像是邀请注册比直接注册通过率高一些。想注册百度推广的朋友可以试试。<br />
邀请地址： <a href="http://union.baidu.com/regSearchUnion.jsp?invitedBy=uvw1uy7_ ">http://union.baidu.com/regSearchUnion.jsp?invitedBy=uvw1uy7_ </a></p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/799.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>默认安装plesk不支持asp解决办法</title>
		<link>http://fugui.in/796.aspx</link>
		<comments>http://fugui.in/796.aspx#comments</comments>
		<pubDate>Fri, 27 Aug 2010 09:20:40 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[asp组件]]></category>
		<category><![CDATA[plesk]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=796</guid>
		<description><![CDATA[Microsoft ASP支持 (尚未安装组件) ASP support (Component was not installed) 默认安装的plesk，新建站点一直提示asp组件为安装，不支持asp，只能挨个站点添加组件才能实现支持asp。 从iis里添加到asp支持并不能应用到所有站点。 并且plesk后台里也显示不支持asp。搜中文搜了接近1年也没找到解决办法。 今天突然切换到英文界面，尝试搜搜英文的提示。 真给面子，plesk官方论坛就有答案： Please uninstall ASP through Add or Remove Windows Components and install it again. Next go to Plesk &#62; Server &#62; Components Management and click Refresh. 从控制面板 &#8230; <a href="http://fugui.in/796.aspx">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Microsoft ASP支持 (尚未安装组件)<br />
<strong>ASP support  (Component was not installed)<br />
默认安装的plesk，新建站点一直提示asp组件为安装，不支持asp，只能挨个站点添加组件才能实现支持asp。<br />
从iis里添加到asp支持并不能应用到所有站点。<br />
并且plesk后台里也显示不支持asp。搜中文搜了接近1年也没找到解决办法。<br />
今天突然切换到英文界面，尝试搜搜英文的提示。<br />
真给面子，plesk官方论坛就有答案：<br />
</strong>Please uninstall ASP through <strong>Add or Remove Windows Components</strong> and  install it again.<br />
Next go to <strong>Plesk &gt; Server &gt; Components Management</strong> and click  <strong>Refresh</strong>.<br />
从控制面板 &#8211; 添加删除windows组件中把asp那个勾去掉，然后再点上重装一遍asp组件就好了。<br />
从Plesk管理面版里&#8211;设置-&gt;服务器组件 里就可以看到asp组件支持了。</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/796.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最怕给人解释问题了</title>
		<link>http://fugui.in/766.aspx</link>
		<comments>http://fugui.in/766.aspx#comments</comments>
		<pubDate>Wed, 18 Aug 2010 16:00:37 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[我的生活]]></category>
		<category><![CDATA[aspx]]></category>
		<category><![CDATA[主机]]></category>
		<category><![CDATA[砍掉成本]]></category>
		<category><![CDATA[砍用户]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=766</guid>
		<description><![CDATA[一个用户,买了linux的主机,问我怎么他的程序在上面打不开? 我一看文件后缀:.aspx. 我说linux不支持.net的.他很有理由:我不是.net的,是asp的. 我说linux也不支持asp.然后友情的解释了一下什么是aspx,什么是asp&#62; 好不容易给他重新换到windows上,才发现他用的是动易的.net+mssql版.然后是跟他解释,什么是数据库&#8230; 然后指导这个网站程序要怎样安装&#8230; 最后他说:我现在心情好复杂,不知道怎样做了. 其实:面对他,我也不知道怎样做了. 被耽误了1个小时零40分钟,现在午夜12点.或许真的要砍用户了,时间成本高的用户要砍掉.]]></description>
			<content:encoded><![CDATA[<p>一个用户,买了linux的主机,问我怎么他的程序在上面打不开?<br />
我一看文件后缀:.aspx.<br />
我说linux不支持.net的.他很有理由:我不是.net的,是asp的.<br />
我说linux也不支持asp.然后友情的解释了一下什么是aspx,什么是asp&gt;<br />
好不容易给他重新换到windows上,才发现他用的是动易的.net+mssql版.然后是跟他解释,什么是数据库&#8230;<br />
然后指导这个网站程序要怎样安装&#8230;<br />
最后他说:我现在心情好复杂,不知道怎样做了.<br />
其实:面对他,我也不知道怎样做了.</p>
<p>被耽误了1个小时零40分钟,现在午夜12点.或许真的要砍用户了,时间成本高的用户要砍掉.</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/766.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ISAPI_Rewrite 3.1 破解方法(转帖)</title>
		<link>http://fugui.in/743.aspx</link>
		<comments>http://fugui.in/743.aspx#comments</comments>
		<pubDate>Mon, 16 Aug 2010 09:24:19 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[精品资源]]></category>
		<category><![CDATA[ISAPI_Rewrite 3.1 full]]></category>
		<category><![CDATA[破解]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=743</guid>
		<description><![CDATA[网上找了很久， 没找到合适的破解文件， 就自已动手了。 文件是在官方下载的， 下载日期为2010.03.18日， 版本为 3.1.0.72 破解补丁我就不发出来了，原因就不说了 XD~ 首先， 在文件httpd.conf上面输入注册信息： RegistrationName= www.gzxnzj.cn RegistrationCode= 2EAD-35GH-66NN-ZYBA //为什么要在文件里手动输入？ 其实是因为这个软件的“注册”按钮点不了，所以就手动在文件里输了 接着就是破解了， 第一步：破解主文件（Helicon Manager.exe）。 OD 载入，找到以下代码：(方法一） 1003E785     55                      push ebp 1003E786     8BD3                 mov &#8230; <a href="http://fugui.in/743.aspx">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>网上找了很久， 没找到合适的破解文件， 就自已动手了。<br />
文件是在官方下载的， 下载日期为2010.03.18日， 版本为 3.1.0.72<br />
破解补丁我就不发出来了，原因就不说了 XD~<br />
首先， 在文件httpd.conf上面输入注册信息：<br />
RegistrationName= www.gzxnzj.cn<br />
RegistrationCode= 2EAD-35GH-66NN-ZYBA<br />
//为什么要在文件里手动输入？ 其实是因为这个软件的“注册”按钮点不了，所以就手动在文件里输了<br />
接着就是破解了， 第一步：破解主文件（Helicon Manager.exe）。<br />
OD 载入，找到以下代码：(方法一）<br />
1003E785     55                      push ebp<br />
1003E786     8BD3                 mov edx,ebx<br />
1003E788     8D4C24 70        lea ecx,dword ptr ss:[esp+70]<br />
1003E78C     E8 EFE9FFFF   call ISAPI_Re.1003D180   ; 这是函数是用来检验注册码的，结果放在al里<br />
1003E791     83C4 10             add esp,10<br />
1003E794     84C0                 test al,al ; al 为1时，注册成功，0时注册失败<br />
1003E796     75 30                jnz short ISAPI_Re.1003E7C8 ; 为1就跳，我直接将jnz修改为jmp<br />
这样做的好处是， 不管它是真注册码还是假注册，通通变为应该成功！<br />
所以很简单的一步，就是将 jnz 修改为 jmp 就暴力破解成功了， 哈哈~<br />
但是，通过分析得知，这个检验注册码的函数有两个地方调用，另一个好像是对于假码使用的，<br />
所以我直接修改另一个地方：(方法二）<span id="more-743"></span><br />
1003D88A   ^\75 F4                jnz short ISAPI_Re.1003D880<br />
1003D88C     EB 3D               jmp short ISAPI_Re.1003D8CB<br />
1003D88E     B0 01                xor al,al                                          ; 这个清0了<br />
1003D890     E9 C0010000    jmp ISAPI_Re.1003DA55<br />
1003D895     0FB6C9             movzx ecx,cl<br />
1003D898     8B3C8D 38000B10      mov edi,dword ptr ds:[ecx*4+100B0038]<br />
1003D89F     B8 01000000     mov eax,1<br />
1003D8A4     8D50 04             lea edx,dword ptr ds:[eax+4]<br />
1003D8A7     85F8                  test eax,edi<br />
看到上面那个清0了没？也就假码它才会清0吧，呵呵~<br />
我将 xor al,al 修改成 mov al,1<br />
我不知道这个会不会有啥影响，所以一般用第一个方法修改就可以了，方法二可以不用。<br />
这样稳定会更高一些吧，哈哈~<br />
(上面修改完保存的时候，实际上是这个DLL 文件ISAPI_RewriteSnapin.dll )<br />
修改完了主程序，第二步，破解 ISAPI， 也就是 ISAPI_Rewrite.dll<br />
跟上面差不多，OD载入，找到以下代码：（方法一）<br />
1003E77F   |.  8D9E B0000000      lea ebx,dword ptr ds:[esi+B0]<br />
1003E785   |.  55                            push ebp<br />
1003E786   |.  8BD3                       mov edx,ebx<br />
1003E788   |.  8D4C24 70              lea ecx,dword ptr ss:[esp+70]<br />
1003E78C   |.  E8 EFE9FFFF        call ISAPI_Re.1003D180 ;  这是注册码检验函数，跟上面一样<br />
1003E791   |.  83C4 10                  add esp,10<br />
1003E794   |.  84C0                       test al,al; 跟上面一样，1注册成功，0注册失败<br />
1003E796   |.  75 30                       jnz short ISAPI_Re.1003E7C8;  1就跳，0就不跳<br />
修改方法，跟上面一样， 将 jnz 修改为 jmp，就是无论是1还是0, 进行无条件跳转，破解成功!<br />
（方法二）：理由跟上面一样<br />
1003D88A   |.^\75 F4              \jnz short ISAPI_Re.1003D880<br />
1003D88C   |.  EB 3D              jmp short ISAPI_Re.1003D8CB<br />
1003D88E   |&gt;  B0 01              xor al,al                                          ;  这个清0了<br />
1003D890   |.  E9 C0010000   jmp ISAPI_Re.1003DA55<br />
1003D895   |&gt;  0FB6C9                     movzx ecx,cl<br />
1003D898   |.  8B3C8D 38000B10    mov edi,dword ptr ds:[ecx*4+100B0038]<br />
1003D89F   |.  B8 01000000             mov eax,1<br />
看到上面的清0没？ 其实跟主程序基本上是一样的，修改方法<br />
xor al,al 修改为 mov al,1<br />
破解成功！<br />
还是那句话，由于懒得好好分析它的原理和测试，所以，建议使用方法一就足够了。 哈哈~<br />
剩下的， 就是应用了，自己试试吧。 我在本机测试通过 XD~<br />
别忘了， 修改后记得保存哦！ 而且要记得保存原文件，以防万一</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/743.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>域名对网站成功作用微乎其微</title>
		<link>http://fugui.in/734.aspx</link>
		<comments>http://fugui.in/734.aspx#comments</comments>
		<pubDate>Sun, 01 Aug 2010 15:20:01 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[域名的重要性]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=734</guid>
		<description><![CDATA[大家都在说域名的重要性，说来说去无非以下几点： 作者：飞克斯 域名的重要性都是意淫。。。域名对网站成功作用微乎其微【个人观点】 ——针对虚拟资产保护的问题：这点是重点针对企业来说的，但是真的如IDC们和CNNIC说的那么严重吗，一个企业网站当然最好用全拼或者品牌名注册网址，能方便给大家记住。但是除了若干互联网企业来说这个虚拟资产并没有我们在乎的严重。中国中小企业数不胜数，同名同字的公司绝对不在少数，同音不同字的更是大有所在。那么请问：同样公司名的企业应该给于谁保护？你是不是要把主流后缀全部注册才算保护？那其他同名企业怎么办？佛山最大的陶瓷企业之一“新中源”的域名也并不是大家鼓吹的全拼xinzhongyuan而是newzhongyuan，这并没有影响到业绩，反而新中源从陶瓷企业到酒店服务业都做得风生水起，现在又在扩建商务中心。现在CNNIC又在推广&#8221;.中国&#8221;的后缀了，你也要注册一个保护一下吗？ ——针对域名越短越好的问题：假如你不知道互联网历史，那就去找找看。从www.a.com到www.z.com的26个域名有几个大站？www.1.com到www.9.com有几个大站？从www.aa.com到www.zz.com的676个域名又有几个大站？看看全球最早注册的域名列表和目前全球排名前一百位的网站，看看就知道了，域名的长度对网站的推广和质量没有丝毫关系。 ——针对最好是单词或者是全拼等有意义组合的问题：例子好像都不用举了，看看google和yahoo就知道了，是因为站成就了词而不是词成就了站。如果国外的例子不能说明情况，那举个近点的例子，还记得当时的chinaren（中国人）网站吗，当时首屈一指的chinaren的成功的域名正是大家深恶痛绝的英文+拼音。那谁可以告诉我sohu和sina的字面意思是什么。为什么www.menhu.com没有做成中国第一门户？为什么www.sousuo.com或者www.search.com没有做成最牛叉搜索引擎？ ——针对最好的后缀是com的问题：最近唐骏的西太平洋大学挺出名的，方舟子还出了一篇文章好像叫做《如何鉴别“克莱登”大学》明确了一点，凡是com结尾的大学十之八九是野鸡大学。com域名的优势在于普及和应用，并不见得就是网站成功的重要原因。之所以域名有这么多后缀正是因为满足了不同领域的专业性。还记得微点不，人家主打的cn米和新浪、瑞星一起也没用主流的com，丝毫没有影响用户群的忠诚。各个国家的重要网站基本上都是国别后缀的，中国的com盛行基本上旁证了CNNIC政策朝令夕改的失败。 ——其实炒米和米商都在拿着某些天价域名YY自己。就像自己家里有个旧酒坛子就当成官窑的瓷器一样，说白了都是投机心理，很多米被炒来炒去都没有什么正果。有些则是妄图用所谓的优势域名来投机取巧。kaixin.com就是典型，但是到现在也没听说kaixin001就被拉下马。什么叫正牌什么叫山寨，在域名世界里也许根本就不存在，你做成功了，你就是正主，你的域名再山寨都会被奉作申明&#8230;说白了，域名好坏都是自慰，专心做站才是王道！]]></description>
			<content:encoded><![CDATA[<p>大家都在说域名的重要性，说来说去无非以下几点：</p>
<p>作者：飞克斯<br />
<strong>域名的重要性都是意淫。。。域名对网站成功作用微乎其微【个人观点】</strong><br />
——针对虚拟资产保护的问题：这点是重点针对企业来说的，但是真的如IDC们和CNNIC说的那么严重吗，一个企业网站当然最好用全拼或者品牌名注册网址，能方便给大家记住。但是除了若干互联网企业来说这个虚拟资产并没有我们在乎的严重。中国中小企业数不胜数，同名同字的公司绝对不在少数，同音不同字的更是大有所在。那么请问：同样公司名的企业应该给于谁保护？你是不是要把主流后缀全部注册才算保护？那其他同名企业怎么办？佛山最大的陶瓷企业之一“新中源”的域名也并不是大家鼓吹的全拼xinzhongyuan而是newzhongyuan，这并没有影响到业绩，反而新中源从陶瓷企业到酒店服务业都做得风生水起，现在又在扩建商务中心。现在CNNIC又在推广&#8221;.中国&#8221;的后缀了，你也要注册一个保护一下吗？</p>
<p>——针对域名越短越好的问题：假如你不知道互联网历史，那就去找找看。从<a href="http://www.a.com到www.z.com/" target="_blank">www.a.com到www.z.com</a>的26个域名有几个大站？<a href="http://www.1.com到www.9.com/" target="_blank">www.1.com到www.9.com</a>有几个大站？从<a href="http://www.aa.com到www.zz.com/" target="_blank">www.aa.com到www.zz.com</a>的676个域名又有几个大站？看看全球最早注册的域名列表和目前全球排名前一百位的网站，看看就知道了，域名的长度对网站的推广和质量没有丝毫关系。</p>
<p>——针对最好是单词或者是全拼等有意义组合的问题：例子好像都不用举了，看看google和yahoo就知道了，是因为站成就了词而不是词成就了站。如果国外的例子不能说明情况，那举个近点的例子，还记得当时的chinaren（中国人）网站吗，当时首屈一指的chinaren的成功的域名正是大家深恶痛绝的英文+拼音。那谁可以告诉我sohu和sina的字面意思是什么。为什么<a href="http://www.menhu.com/" target="_blank">www.menhu.com</a>没有做成中国第一门户？为什么<a href="http://www.sousuo.com或者www.search.com/" target="_blank">www.sousuo.com或者www.search.com</a>没有做成最牛叉搜索引擎？</p>
<p>——针对最好的后缀是com的问题：最近唐骏的西太平洋大学挺出名的，方舟子还出了一篇文章好像叫做《如何鉴别“克莱登”大学》明确了一点，凡是com结尾的大学十之八九是野鸡大学。com域名的优势在于普及和应用，并不见得就是网站成功的重要原因。之所以域名有这么多后缀正是因为满足了不同领域的专业性。还记得微点不，人家主打的cn米和新浪、瑞星一起也没用主流的com，丝毫没有影响用户群的忠诚。各个国家的重要网站基本上都是国别后缀的，中国的com盛行基本上旁证了CNNIC政策朝令夕改的失败。</p>
<p>——其实炒米和米商都在拿着某些天价域名YY自己。就像自己家里有个旧酒坛子就当成官窑的瓷器一样，说白了都是投机心理，很多米被炒来炒去都没有什么正果。有些则是妄图用所谓的优势域名来投机取巧。kaixin.com就是典型，但是到现在也没听说kaixin001就被拉下马。什么叫正牌什么叫山寨，在域名世界里也许根本就不存在，你做成功了，你就是正主，你的域名再山寨都会被奉作申明&#8230;说白了，域名好坏都是自慰，专心做站才是王道！</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/734.aspx/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ename.cn域名转移成功</title>
		<link>http://fugui.in/730.aspx</link>
		<comments>http://fugui.in/730.aspx#comments</comments>
		<pubDate>Sun, 01 Aug 2010 14:38:05 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[我的生活]]></category>
		<category><![CDATA[ename]]></category>
		<category><![CDATA[域名转移]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=730</guid>
		<description><![CDATA[7月23买了个域名，发现11天之后就是8月3号就要到期了， ename续费是100元，尝试转移到国外自己的平台下。(ename的规定是域名到期前15天不允许转移) 要获取ename的手机获取转移密码的权限，还要发个签字的协议文件，这个文件又花费了3天时间，7月26号才获取到转移密码，然后提交的转移请求，此时距离域名到期时间还有8天。 然而就在今天，8月1号，域名到期前2天，转移成功。 www.2nj.net 转移成功。]]></description>
			<content:encoded><![CDATA[<p>7月23买了个域名，发现11天之后就是8月3号就要到期了，<br />
ename续费是100元，尝试转移到国外自己的平台下。(ename的规定是域名到期前15天不允许转移)<br />
要获取ename的手机获取转移密码的权限，还要发个签字的协议文件，这个文件又花费了3天时间，7月26号才获取到转移密码，然后提交的转移请求，此时距离域名到期时间还有8天。<br />
然而就在今天，8月1号，域名到期前2天，转移成功。<br />
<a href="http://www.2nj.net">www.2nj.net</a> 转移成功。</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/730.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>来玩PHP面向对象编程吧 [教程 连载中...第8玩]</title>
		<link>http://fugui.in/716.aspx</link>
		<comments>http://fugui.in/716.aspx#comments</comments>
		<pubDate>Sun, 01 Aug 2010 01:54:53 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[精品资源]]></category>
		<category><![CDATA[php教程]]></category>
		<category><![CDATA[PHP面向对象编程]]></category>
		<category><![CDATA[边玩边学php]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=716</guid>
		<description><![CDATA[作者:落伍hetty,写的很生动.学起来一点也不累,我转载过来. 好久没有来落伍了，既然来了就做点微薄的贡献吧。既然是教程，为什么说“玩”而不说“学”呢？问得好，因为说“学”的话，别人一看见标题基本就躲得远远的，根本懒得去点，说“玩”的话，估计还有那么一两个人来点，哈哈，好吧，我承认我是标题党，你赢了。 还是那句老话：我的个人能力有限，教程如果有什么疏漏和不足的地方，望大家多多见谅，也欢迎大家批评指正。 ［目标读者］ 本教程假设读者已经有了一定的PHP编程基础和经验，但还未开始接触PHP面向对象编程(以下简称OOP)。因此，如果你是小鸟或者大鸟，都可以选择直接路过了。 ［教程宗旨］ 这是一篇有悖常理的、大胆的教程，因为我要在不涉及或尽少涉及OOP概念的前提下，向读者介绍PHP的OOP。绝大部分PHPer对OOP敬而远之、退避三舍，就是被OOP那抽象繁琐、把人弄得焦头烂额的概念吓跑的，所以，本教程有意识的避开了OOP概念的讲解，力求通过实例用最简单、最通俗的方式来表述PHP的OOP。           ［教程目录］ 第1玩——————来玩类和对象的关系 (7楼) 第2玩——————来玩类的创建 (24楼) 第3玩——————来玩类的实例化 (29楼) 第4玩——————来玩类的访问 (33楼) 第5玩——————来玩类的构造方法和析构方法(48楼) 第6玩——————来玩类的封装(51楼) 第7玩——————来玩类的特殊方法(61楼) 第8玩——————来玩类的继承(75楼) 第9玩——————来玩类的重载(待续) ……………… (边写边补充吧) 由于时间的关系，我可能无法保证本教程有一个正常规律的更新速度，在此希望大家能够见谅，没有耐心的朋友可以等到教程连载完毕再看。   为了抓紧时间，我就直接在这里统一作下简单的回答。 首先是关于PHP的，PHP在很多大型项目中被运用，比如大家熟知的： 百度：http://www.baidu.com/index.php 淘宝：http://www.taobao.com/index.php             &#8230; <a href="http://fugui.in/716.aspx">继续阅读 <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>作者:落伍hetty,写的很生动.学起来一点也不累,我转载过来.</p>
<div><span style="color: #0000ff;">好久没有来落伍了，既然来了就做点微薄的贡献吧。既然是教程，为什么说“玩”而不说“学”呢？问得好，因为说“学”的话，别人一看见标题基本就躲得远远的，根本懒得去点，说“玩”的话，估计还有那么一两个人来点，哈哈，好吧，我承认我是标题党，你赢了。</span></div>
<div><span style="color: #0000ff;">还是那句老话：我的个人能力有限，教程如果有什么疏漏和不足的地方，望大家多多见谅，也欢迎大家批评指正。</span></div>
<div><span style="color: #0000ff;">［目标读者］<br />
本教程假设读者已经有了一定的PHP编程基础和经验，但还未开始接触PHP面向对象编程(以下简称OOP)。因此，如果你是小鸟或者大鸟，都可以选择直接路过了。</span></div>
<div><span style="color: #0000ff;">［教程宗旨］<br />
这是一篇有悖常理的、大胆的教程，因为我要在不涉及或尽少涉及OOP概念的前提下，向读者介绍PHP的OOP。绝大部分PHPer对OOP敬而远之、退避三舍，就是被OOP那抽象繁琐、把人弄得焦头烂额的概念吓跑的，所以，本教程有意识的避开了OOP概念的讲解，力求通过实例用最简单、最通俗的方式来表述PHP的OOP。</span></div>
<div><span style="color: #0000ff;"> </span></div>
<div><span style="color: #0000ff;"> </span></div>
<div><span style="color: #0000ff;"> </span></div>
<div><span style="color: #0000ff;"> </span></div>
<p><span style="color: #0000ff;"> </p>
<p></span></p>
<p>［教程目录］<br />
第1玩——————来玩类和对象的关系 (7楼)<br />
第2玩——————来玩类的创建 (24楼)<br />
第3玩——————来玩类的实例化 (29楼)<br />
第4玩——————来玩类的访问 (33楼)<br />
第5玩——————来玩类的构造方法和析构方法(48楼)<br />
第6玩——————来玩类的封装(51楼)<br />
第7玩——————来玩类的特殊方法(61楼)<br />
第8玩——————来玩类的继承(75楼)<br />
第9玩——————来玩类的重载(待续)<br />
………………<br />
(边写边补充吧)<span id="more-716"></span></p>
<p>由于时间的关系，我可能无法保证本教程有一个正常规律的更新速度，在此希望大家能够见谅，没有耐心的朋友可以等到教程连载完毕再看。</p>
<p><span style="color: #0000ff;"> </span></p>
<div><span style="color: #0000ff;"><span style="color: #008000;">为了抓紧时间，我就直接在这里统一作下简单的回答。</span></span></div>
<div><span style="color: #0000ff;"><span style="color: #008000;">首先是关于PHP的，PHP在很多大型项目中被运用，比如大家熟知的：</span></span></div>
<div><span style="color: #0000ff;"><span style="color: #008000;">百度：<a href="http://www.baidu.com/index.php" target="_blank"><span style="color: #008000;">http://www.baidu.com/index.php</span></a><br />
<span style="color: #008000;">淘宝：</span><a href="http://www.taobao.com/index.php" target="_blank"><span style="color: #008000;">http://www.taobao.com/index.php</span></a></span></span></div>
<div><span style="color: #0000ff;"><span style="color: #008000;"> </span></span></div>
<div><span style="color: #0000ff;"><span style="color: #008000;"> </span></span></div>
<div><span style="color: #0000ff;"><span style="color: #008000;"> </span></span></div>
<div><span style="color: #0000ff;"><span style="color: #008000;"> </span></span></div>
<div><span style="color: #0000ff;"><span style="color: #008000;"> </span></span></div>
<p><span style="color: #0000ff;"><span style="color: #008000;"> </p>
<p></span></p>
<div><span style="color: #008000;">等等，由于篇幅关系，我就不多举例了。PHP在国内外大型项目中的运用是屡见不鲜的，它被证明强大是经受了无数实战考验的，每个人都有权质疑它的强大，但是在此之前，我们需要先抱着谦卑的态度去了解它。</span></div>
<div><span style="color: #008000;">这里融入一些个人感情，注意是个人的，我最喜欢、用得最多的服务端脚本语言就是PHP，也认为它是所有服务端脚本语言中最优秀的。</span></div>
<div><span style="color: #008000;">其次是关于PHP的OOP，这是仁者见仁智者见智的事情，PHP是混合型语言，这也可以看作是它的优势之一。</span></div>
<div><span style="color: #008000;"> </span></div>
<div><span style="color: #008000;"> </span></div>
<div><span style="color: #008000;"> </span></div>
<div><span style="color: #008000;"> </span></div>
<div><span style="color: #008000;"> </span></div>
<p><span style="color: #008000;"> </p>
<p></span></span></p>
<div>
<blockquote><p><span style="color: #008000;">我们可以拿起锯子就做一把椅子，但是不经过计划拿起锯子就来建造一栋房子，房子的质量就没有保证了。</span></p></blockquote>
</div>
<p><span style="color: #008000;">那么有位回帖的朋友就刚好说反了，OOP其实可以让PHP的代码更加简洁易懂，除此之外，更加易于维护，并且具有更强的重用性。<br />
</span></p>
<p><span style="color: #008000;"> </span></p>
<h2>第1玩——————来玩类和对象的关系</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56310911"><em>本帖最后由 hetty 于 2010-7-9 10:07 编辑 </em>假设我们要用PHP开发一个游戏……<br />
“PHP能开发游戏吗？”<br />
“不能吗？”<br />
“你开发一个给我看看！”<br />
“你给我钱嘛！”<br />
“滚！”<br />
(orz 不要再废话了，抓紧时间进入正题)好了，这个无聊的争论就不要继续了，我总不能拿按钮、文本域、表格这些东东当作对象给初学者们讲述OOP吧？那样大家会崩溃的，我也会崩溃的。为了增加本教程的易懂性、通俗性和趣味性……我决定了就假设我们要用PHP开发一个游戏，都说了，要玩嘛。首先声明OOP的概念是很重要的，因为它是OOP编程思想的基础，我在本教程里刻意的回避概念性问题，是为了降低初学者的恐惧心、增加初学者的求知欲，前面说了，很多不原意接触OOP的PHPer就是被概念折腾的。所以，大家千万不要跟人家说，啊，那个谁？Hetty说了，OOP概念算个屁，不用去管。OMG……那我岂不是成了罪人？本教程旨在先玩会OOP，再去了解OOP的概念。如果你没有玩过星际争霸和魔兽争霸的话，突然蹦出一个人就跟你大谈游戏平衡性的概念，就算他一套一套的跟你讲得头头是道，你势必也将是一头雾水，但如果是你玩过这两款游戏的话，根本不需要谁跟你讲，就算游戏平衡性的概念再飘逸，你自己也能在玩的过程中感觉到、体会到的。OOP也是一样，你自己悟出来的要比别人言传身教的清晰牢固千百倍，这就是本教程的出发点。至于吗？强调这么多遍……好吧，你赢了，先看图，在这个游戏里，我们将设计三个角色：</p>
<div id="aimg_124242_menu">
<div><a href="http://fugui.in/wp-content/uploads/2010/08/opp.gif"><img class="alignnone size-full wp-image-717" title="opp" src="http://fugui.in/wp-content/uploads/2010/08/opp.gif" alt="" width="466" height="382" /></a></div>
</div>
<p> </p>
<p>(就这水平了，将就着看吧)<br />
红色是类，蓝色是对象。很多初学者经常把类和对象混淆，如果你是这类人，那么就多看一段时间，把这个图印在你心里，反复揣摩。如果你连思考都不愿意的话，那么就不必再往下看了，因为那是在浪费时间。</p>
<p>看好了吗？什么？一分钟都不到，回去继续看，是男人就持久点。</p>
<p>看出什么端倪了吗？我们可以看到红色的“角色”是空心的，因为它不是一个实体，只是个虚无缥渺的词汇，我们看不见摸不着，但是它却存在于我们心里；而蓝色“春哥“、”曾哥“和”凤姐“是实心的，因为它们是实体，是三个真真切切的人，我们看得见摸得着(如果敢摸的话)，存在于我们的生活中。</p>
<p>在这个游戏中，你可以说“春哥”是一个“角色”，但绝对不能倒过来说“角色”是一个“春哥”，就像你不能说“水果”是一种“苹果”一样，不止是逻辑上说不过去，就连语法上也说不过去，这个……只需要小学语文水平就可以理解。</p>
<p>因此我们可以得出以下结论：</p>
<p><strong>类</strong>　：是<strong>抽象</strong>的<strong>名称</strong><br />
<strong>对象</strong>：是<strong>具体</strong>的<strong>东东</strong></p>
<p>其实类并不是什么新的概念，类，顾名思义，就是分类、种类、类别……我们从小就开始接触它了，习惯好的小朋友喜欢把自己的东西整理归类摆放好，比如变形金刚放一边啊、小人书放一边啊……这“变形金刚”和“小人书”就是类了啊。</p>
<p>既然我们主题是玩，那么就拿“变形金刚”这个类来说说，它是很笼统、很抽象的名称，而非一个实体。如果把它具体化，那么我们就可以得到实体的对象，比如“大黄蜂”、“擎天柱”、“铁皮”。</p>
<p>“大黄蜂”、“擎天柱”、“铁皮”<strong>用抽象点的话说</strong>就是“变形金刚”。<br />
“变形金刚”<strong>用具体点的话说</strong>就是“大黄蜂”、“擎天柱”、“铁皮”。</p>
<p>因此我们可以得出以下结论：</p>
<p><strong>类</strong>是<strong>对象</strong>的<strong>抽象化</strong><br />
<strong>对象</strong>是<strong>类</strong>的<strong>具体化</strong></p>
<p>把一个类具体化以后可以得到多个对象，把多个对象抽象化后可以得到一个类。</p>
<p>这时有人就会问了，生活中的类我们很熟悉，很好区分啊，那么程序中的类该怎么区分呢？其实道理是一样的，我们把有相同特征的东东归为一类就可以了。比如“大黄蜂”、“擎天柱”、“铁皮”，他们有相同的特性(属性)：有高度、有重量、有颜色；他们有相同的行为(方法)：会变形、会说话、会走路。因此，在程序中，我们经常把具有<strong>相同属性和方法的对象</strong>归为一类。</p>
<p>每个对象都是唯一的，就算你有两个一模一样的“大黄蜂”，但是每个“大黄蜂”都是独立存在的个体，就像同名同姓的人很多，但是“春哥”却是这个世界上独一无二的(多了这个世界会灭亡的)。</p>
<p><strong>程序与生活不同的地方：</strong></p>
<p>在生活中，往往是把一组对象归为一类：先有了很多苹果的果实，我们才能把它们归为苹果类。<br />
在程序中，往往是用类来产生一组对象：先有了角色类，我们才能创造出春哥、曾哥和凤姐来。</p>
<p>好了，今天就玩到这里，表达能力有限，不知道大家看明白没有？如果没有看明白的话，争取看明白，因为这篇看明白了，后面就将一马平川，越来越好玩。</td>
</tr>
</tbody>
</table>
</div>
<h2>回复</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56362775"><em>本帖最后由 hetty 于 2010-7-9 10:05 编辑 </em>感谢大家参与，关于面向对象和面向过程，前面我已经表示得很清楚了，PHP是一种混合型语言，这也是它的优势，因此，我们可以拿起锯子就做一把椅子(面向过程)，也可以经过周密的计划来建造一栋房子(面向对象)，无论是面向对象还是面向过程，都有自己的优势，都要付出一定的代价。但是，我们还是要会玩面向对象才行啊，因为从某种意义上来讲，面向过程已经是一种过于&#8221;传统&#8221;的编程思想，毕竟面向对象更符合现实的逻辑。从PHP5开始，PHP已经完全支持面向对象，PHP6势必要加强对面向对象的支持。那么PHP官方为什么越来越重视面向对象呢？答案是不言而喻的。起初，PHP只是为个人和小项目而设计的脚本语言，但是现在不一样了，作为最优秀、最流行的客户端脚本语言之一，PHP的地位已经被越来越多的人认可，现今为止它在无数大型项目上的表现也令人感到十分满意，已经证明了它足以胜任任何大型项目。由于它是跨平台、免费的，因此被越来越多的人喜爱和接纳，尤其是JAVA阵营的朋友们。我们不妨来展望一下PHP的未来，通过AMFPHP，PHP与Flex、Flash、Json、XML等技术实现了二进制无缝通信。ActionScript3.0开始，也开始完全支持面向对象，再加上Flex和Flash助阵，我们不仅可以利用PHP来开发WEB应用程序、RIA应用程序、而且还可以开发移动应用程序(Flash逐渐开始在移动平台崭露头角，目前已经得到Android 2.2的支持，注意是真真正正的Flash，而非面向低端手机的Flash Lite，而这一切仅仅是一个开端)，这对我国马上就要到来3G时代有着非凡的意义。因此，对于一个真正的PHPer来说，如果不接触面向对象，那的确是一种遗憾。</td>
</tr>
</tbody>
</table>
</div>
<div>
<h2>第2玩——————来玩类的创建</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56363711"><em>本帖最后由 hetty 于 2010-7-12 15:51 编辑 </em>好，那么从今天开始，我们就要玩代码了，PHP的类里面大概包含两个部分，即它的成员属性和成员方法，不要紧张，我们不去挖它们的概念，所谓属性和方法，就是类里面的成员变量和成员函数。所以从现在开始，只要我提到属性，大家就要下意识的想到它是一个变量；只要我提到方法大家就要下意识的想到，它是一个函数。因此，我在这里给出一个狭义的结论，请大家牢记：<strong>属性</strong>就是<strong>变量</strong><br />
<strong>方法</strong>就是<strong>函数</strong>当然对外大家不能这么说，因为他们性质是截然不同的，由于我们回避了概念性的东西，这么说仅仅是为了便于大家记忆和理解。好，那么我们现在来玩一玩怎么创建一个完整的PHP类。这里可能会涉及到一些命名规范，关于这些规范，大家可以参阅我另外一篇文字《分享下我编程的代码规范》</p>
<p><a href="http://www.im286.com/thread-4111157-1-1.html" target="_blank">http://www.im286.com/thread-4111157-1-1.html</a></p>
<p>创建类的方法：</p>
<div>
<div id="code0">
<ol>
<li>class 类的名称</li>
<li>{</li>
<li>    var $属性的名称;</li>
<li>    function 方法的名称(参数列表)</li>
<li>    {</li>
<li>        ……</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code0'));">复制代码</em></p>
<p>这样就是一个完整的类，怎么样？够简单吧？它本来也就不难，只是很多人由于一些概念性问题不原意接去触它，但是一旦接触了，大家会发现，它也就不过如此嘛，的确，它也就不过如此。</p>
<p>一个类里面可以包含<strong>多个属性</strong>和<strong>多个方法</strong>。</p>
<p>那么我们结合前面假设开发的游戏来设计一个类：</p>
<div>
<div id="code1">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    var $role_name; //角色的名字</li>
<li>    var $role_sex; //角色的性别</li>
<li>    var $role_skill; //角色的技能</li>
<li>    //方法部分</li>
<li>    function roleTalk() //角色说话</li>
<li>    {</li>
<li>        echo &#8216;我会说话&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>    function roleFight() //角色发招</li>
<li>    {</li>
<li>        echo &#8216;我会发招&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code1'));">复制代码</em></p>
<p>这样，一个具有完整属性和方法的类就算是建好了，是不是简单得掉渣呢？至于我们如何利用这个类来创造出“春哥”、“曾哥”和“凤姐”，并且让他们都会说话，都能发招呢？请看下玩分解。</p>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<div>
<h2>第3玩——————来玩类的实例化</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56434388"><em>本帖最后由 hetty 于 2010-7-9 12:38 编辑 </em>所谓<strong>实例化</strong>，就是前面我们提到的<strong>具体化</strong>，只不过实例化这个术语更专业一些，多认识些专业术语没有坏处，说起这个专业术语啊，这个……啊！这个这个……啊！我经常看到一些人，本来很简单的事情，被他们一口一个专业术语，把人家外行人(大部分是客户)忽悠得晕头转向，结果被忽悠的人还在那边一脸一个羡慕……我们不提倡忽悠人，但是我们得建立自己的防忽悠热线，所以多认识一些专业术语还是非常有必要的。扯远了，我们把<strong>类实例化以后就可以得到对象</strong>了，将类实例化的方法：</p>
<div>
<div id="code2">
<ol>
<li>$对象名称 = new 类的名称();</li>
</ol>
</div>
<p><em onclick="copycode($('code2'));">复制代码</em></p>
<p>结合前面的代码，我们要<strong>创建一个“春哥”</strong>，实际上就是要<strong>实例化一个名称为“春哥”的对象</strong>，代码如下：</p>
<div>
<div id="code3">
<ol>
<li>$brother_chun = new Role();</li>
</ol>
</div>
<p><em onclick="copycode($('code3'));">复制代码</em></p>
<p>到这里可能要有人感叹了，这PHP的OOP咋越玩越简单呢？没错，后面会越来越简单。为了方便大家查看，给出完整的代码如下：</p>
<div>
<div id="code4">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    var $role_name; //角色的名字</li>
<li>    var $role_sex; //角色的性别</li>
<li>    var $role_skill; //角色的技能</li>
<li>    //方法部分</li>
<li>    function roleTalk() //角色说话</li>
<li>    {</li>
<li>        echo &#8216;我会说话&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>    function roleFight() //角色发招</li>
<li>    {</li>
<li>        echo &#8216;我会发招&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>}</li>
<li>//将角色类实例化</li>
<li>$brother_chun = new Role(); //创建一个名称为“春哥”的对象</li>
<li>$brother_zeng = new Role(); //创建一个名称为“曾哥”的对象</li>
<li>$sister_feng = new Role(); //创建一个名称为“凤姐”的对象</li>
</ol>
</div>
<p><em onclick="copycode($('code4'));">复制代码</em></p>
<p>当然我们还可以创建无数个其他人，虽然代码比较少，但是类的第一个好处<strong>代码重用</strong>已经显而易见了，我们可以通过一个类来创建无数个对象，设想如果一个类里面有成百上千行代码的话，我们可以节省多少行代码啊？</p>
<p>再设想，我们已经在游戏里创建了100个人，突然某天我们想要修改他们，如果不使用类创建的话，那么我们可能就要修改100个地方，而我们使用了类之后，仅仅只需要修改1个地方——修改我们的类即可，于是类的第二个好处<strong>易于维护</strong>也显而易见了，我们可以节省多少精力啊？</p>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p> </p>
<h2>第4玩——————来玩类的访问</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56458175"><em>本帖最后由 hetty 于 2010-7-9 15:56 编辑 </em>这个Discuz的编辑器好像有问题啊，我在段落的开头手动空两格，有些时候提交之后就被自动清除了……郁闷。那么我干脆不排版了，每段都顶头写，为了统一版面让大家看起来舒服点，前面的也全部改成这种样子好了。好，今天我们要玩的东西比较多，所以要集中精力哦。我们已经通过将类实例化来创建了“春哥”、“曾哥”和“凤姐”，但是他们还不能说话、还不能发招，怎么办呢？这就需要我们通过访问类的内容来实现。所谓访问，也是个专业术语，为了方便大家记忆和理解，大家只需要记住：<strong>访问</strong>就是<strong>使用</strong></p>
<p>我们要<strong>使用“春哥”的特性</strong>，实际上就是要<strong>访问“春哥”的属性</strong>；<br />
我们要<strong>使用“春哥”的行为</strong>，实际上就是要<strong>访问“春哥”的方法</strong>。</p>
<p>从类的<strong>内部</strong>访问属性和方法，我们要用<strong>this关键字</strong>。</p>
<p>访问属性：</p>
<div>
<div id="code0">
<ol>
<li>$this-&gt;属性的名称;</li>
</ol>
</div>
<p><em onclick="copycode($('code0'));">复制代码</em></p>
<p>设置属性值(其实跟变量赋值是一个道理)：</p>
<div>
<div id="code1">
<ol>
<li>$this-&gt;属性的名称 = 属性的值;</li>
</ol>
</div>
<p><em onclick="copycode($('code1'));">复制代码</em></p>
<p>访问方法：</p>
<div>
<div id="code2">
<ol>
<li>$this-&gt;方法的名称();</li>
</ol>
</div>
<p><em onclick="copycode($('code2'));">复制代码</em></p>
<p>从类的<strong>外部</strong>访问属性和方法，我们要使用<strong>对象的名称</strong>。</p>
<p>访问属性：</p>
<div>
<div id="code3">
<ol>
<li>$对象的名称-&gt;属性的名称;</li>
</ol>
</div>
<p><em onclick="copycode($('code3'));">复制代码</em></p>
<p>设置属性值(其实跟变量赋值是一个道理)：</p>
<div>
<div id="code4">
<ol>
<li>$对象的名称-&gt;属性的名称 = 属性的值;</li>
</ol>
</div>
<p><em onclick="copycode($('code4'));">复制代码</em></p>
<p>访问方法：</p>
<div>
<div id="code5">
<ol>
<li>$对象的名称-&gt;方法的名称();</li>
</ol>
</div>
<p><em onclick="copycode($('code5'));">复制代码</em></p>
<p>注意：在访问时，属性的名称是<strong>不带$号</strong>的，这一点，在《PHP 和 MySQL Web开发》(第三版)一书中的有些例子是错误的，虽然这本书被称为PHP的“圣经”，但是无论什么样书都难免出现人为的失误，所谓人非圣贤，孰能无过？所以俗话说<strong>尽信书不如无书</strong>，同样的提醒正在看我这篇教程的初学者们，<strong>尽信我不如无我</strong>，最重要的还是要大家自己去思考，培养独立思考的能力，不是吗？</p>
<p>光看上面的内容可能很难看出什么来，这很正常，没有关系，下面我们马上通过实例来说明它们的作用。</p>
<p>首先我们完善角色类，让它拥有一切比较实际的功能，这时，我们就要用到<strong>内部访问</strong>来修改它了：</p>
<div>
<div id="code6">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    var $role_name; //角色的名字</li>
<li>    var $role_sex; //角色的性别</li>
<li>    var $role_skill; //角色的技能</li>
<li>    //方法部分</li>
<li>    function roleTalk() //角色说话</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;说：&#8217;.'我是一个&#8217;.$this-&gt;role_sex.&#8217;人&lt;br /&gt;&#8217;; //输出：(角色的名字)说：我是一个(角色的性别)人</li>
<li>    }</li>
<li>    function roleFight() //角色发招</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;使出了一招：&#8217;.$this-&gt;role_skill.&#8217;&lt;br /&gt;&#8217;; //输出：(角色的名字)使出了一招：(角色的技能)</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code6'));">复制代码</em></p>
<p>为了方便讲解，每个方法里我只用了一个echo作为它的功能。当然如果你有时间和精力的话，可以去做一些更为复杂强大的功能。</p>
<p>接下来，如果我们要让“春哥”这个对象“活”起来，那么就要用<strong>外部访问</strong>了：</p>
<div>
<div id="code7">
<ol>
<li>//别忘了要一定先new一个名称为brother_chun的对象哦</li>
<li>$brother_chun = new Role();</li>
<li>//设置属性</li>
<li>$brother_chun-&gt;role_name = &#8216;春哥&#8217;; //设置“春哥”的名字</li>
<li>$brother_chun-&gt;role_sex = &#8216;男&#8217;; //设置“春哥”的性别</li>
<li>$brother_chun-&gt;role_skill = &#8216;霸气菊花残&#8217;; //设置“春哥”的技能</li>
<li>//访问方法</li>
<li>$brother_chun-&gt;roleTalk(); //让“春哥”说话</li>
<li>$brother_chun-&gt;roleFight(); //让“春哥”发招</li>
</ol>
</div>
<p><em onclick="copycode($('code7'));">复制代码</em></p>
<p>同理于“曾哥”和“凤姐”，为了方便大家查看，给出完整代码：</p>
<div>
<div id="code8">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    var $role_name; //角色的名字</li>
<li>    var $role_sex; //角色的性别</li>
<li>    var $role_skill; //角色的技能</li>
<li>    //方法部分</li>
<li>    function roleTalk() //角色说话</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;说：&#8217;.'我是一个&#8217;.$this-&gt;role_sex.&#8217;人&lt;br  /&gt;&#8217;; //输出：(角色的名字)说：我是一个(角色的性别)人</li>
<li>    }</li>
<li>    function roleFight() //角色发招</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;使出了一招：&#8217;.$this-&gt;role_skill.&#8217;&lt;br /&gt;&lt;br /&gt;&#8217;; //输出：(角色的名字)使出了一招(角色的技能)</li>
<li>    }</li>
<li>}</li>
<li>//“春哥”横空出世</li>
<li>$brother_chun = new Role();</li>
<li>//设置属性</li>
<li>$brother_chun-&gt;role_name = &#8216;春哥&#8217;;</li>
<li>$brother_chun-&gt;role_sex = &#8216;男&#8217;;</li>
<li>$brother_chun-&gt;role_skill = &#8216;霸气菊花残&#8217;;</li>
<li>//访问方法</li>
<li>$brother_chun-&gt;roleTalk();</li>
<li>$brother_chun-&gt;roleFight();</li>
<li>//“曾哥”横空出世</li>
<li>$brother_zeng = new Role();</li>
<li>//设置属性</li>
<li>$brother_zeng -&gt;role_name = &#8216;曾哥&#8217;;</li>
<li>$brother_zeng -&gt;role_sex = &#8216;男&#8217;;</li>
<li>$brother_zeng -&gt;role_skill = &#8216;爷们菊花劫&#8217;;</li>
<li>//访问方法</li>
<li>$brother_zeng -&gt;roleTalk();</li>
<li>$brother_zeng -&gt;roleFight();</li>
<li>//“凤姐”横空出世</li>
<li>$sister_feng = new Role();</li>
<li>//设置属性</li>
<li>$sister_feng -&gt;role_name = &#8216;凤姐&#8217;;</li>
<li>$sister_feng -&gt;role_sex = &#8216;女&#8217;;</li>
<li>$sister_feng -&gt;role_skill = &#8216;知音故事会&#8217;;</li>
<li>//访问方法</li>
<li>$sister_feng -&gt;roleTalk();</li>
<li>$sister_feng -&gt;roleFight();</li>
</ol>
</div>
<p><em onclick="copycode($('code8'));">复制代码</em></p>
<p>运行后得到结果如下：</p>
<div>
<blockquote><p>春哥说：我是一个男人<br />
春哥使出了一招：霸气菊花残</p>
<p>曾哥说：我是一个男人<br />
曾哥使出了一招：绵阳菊花劫</p>
<p>凤姐说：我是一个女人<br />
凤姐使出了一招：知音故事会</p></blockquote>
</div>
<p>以此类推，你还可以让更多的人横空出世，让它们有不同的名字、不同的性别、不同的技能。</p>
<p>你也可以给它们加上其他的<strong>属性</strong>：比如攻击力、防御力、生命值、霸气值等等；<br />
或者加上给它们加上其他的<strong>方法</strong>：比如会唱歌、会跳舞、会吃饭、会便便等等。</p>
<p>在这里由于时间和篇幅的关系，我们就不玩那么多了，大家要是有兴趣的话，自己下去慢慢玩吧。</p>
<p>这里着重讲一下<strong>this关键字</strong>的涵义，this顾名思义就是<strong>这个</strong>的意思，因为是在类的<strong>内部</strong>，它是被所有对象<strong>共用</strong>的，所以可以这么理解：这个对象调用了它，它就属于这个对象；哪个对象调用了它，它就属于哪个对象。</p>
<p>比如<strong> $this-&gt;role_sex;</strong> 这句，“春哥”调用了它，在类的内部它就指“春哥”<strong>这个对象</strong>的性别；“曾哥”调用了它，在类的内部它就指“曾哥”<strong>这个对象</strong>的性别；“凤姐”调用了它，在类的内部它就指“凤姐”<strong>这个对象</strong>的性别，同理于其他。</p>
<p>好了，那么关于类最基本的玩法就介绍到这里，希望大家能够花一些宝贵的时间来慢慢消化一下今天我们玩过的东东。一定要好好消化哦，因为从下一玩开始，我们就要逐渐进入类的高级玩法了。</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<h2>第5玩——————来玩类的构造方法和析构方法</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56595373"><em>本帖最后由 hetty 于 2010-7-12 01:33 编辑 </em>所谓<strong>构造方法</strong>，就是在<strong>创建对象时自动执行</strong>的方法，也就是说，当你new一个对象的时候，不管你访不访问它，它都会自动执行。它是可以<strong>带参数</strong>的哦。构造方法通常用来执行一些初始化任务。构造方法的方法名称必须是 <strong>__construct</strong> ，注意前面是<strong>两个下划线</strong>，这是PHP5中的改进，在PHP4中，构造方法和其他语言一样，必须和类的名称相同，当然你要使用这种方式也可以，PHP5还是会认的，但是我不建议这么做，因为那样代码的可读性不强，而且万一某天你想修改类的名称时，你同时还得去修改构造方法的名称，因此我觉得PHP5这个小小的改进比其他语言显得更灵活些。</p>
<p>构造方法(建议使用)</p>
<div>
<div id="code0">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    function __construct(参数列表); //构造方法</li>
<li>    {</li>
<li>        ……</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code0'));">复制代码</em></p>
<p>构造方法(不建议使用)</p>
<div>
<div id="code1">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    function Role(参数列表); //构造方法</li>
<li>    {</li>
<li>        ……</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code1'));">复制代码</em></p>
<p>OK，我们来玩一下代码看看：</p>
<div>
<div id="code2">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    var $role_name; //角色的名字</li>
<li>    var $role_sex; //角色的性别</li>
<li>    var $role_skill; //角色的技能</li>
<li>    //方法部分</li>
<li>    function __construct($name,$sex,$skill) //构造方法，自动执行</li>
<li>    {</li>
<li>       $this-&gt;role_name = $name; //将参数传进来，给“姓名”属性一个初始值</li>
<li>       $this-&gt;role_sex = $sex; //将参数传进来，给“性别”属性一个初始值</li>
<li>       $this-&gt;role_skill = $skill; //将参数传进来，给“技能”属性一个初始值</li>
<li>       echo $this-&gt;role_name.&#8217;横空出世了&lt;br /&gt;&lt;br /&gt;&#8217;; //如果这句话被输出，说明构造方法自动执行了</li>
<li>    }</li>
<li>    function roleTalk() //角色说话</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;说：&#8217;.'我是一个&#8217;.$this-&gt;role_sex.&#8217;人&lt;br /&gt;&#8217;; //输出：(角色的名字)说：我是一个(角色的性别)人</li>
<li>    }</li>
<li>    function roleFight() //角色发招</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;使出了一招：&#8217;.$this-&gt;role_skill.&#8217;&lt;br /&gt;&lt;br /&gt;&#8217;; //输出：(角色的名字)使出了一招(角色的技能)</li>
<li>    }</li>
<li>}</li>
<li>//实例化一个对象，同时将构造方法所需要的参数传入</li>
<li>$brother_chun = new Role(&#8216;春哥&#8217;,'男&#8217;,'霸气菊花残&#8217;);</li>
<li>//属性设置(因为我们我们已经在构造方法中给了属性初始值，所以不需要设置了)</li>
<li>//访问方法</li>
<li>$brother_chun-&gt;roleTalk();</li>
<li>$brother_chun-&gt;roleFight();</li>
</ol>
</div>
<p><em onclick="copycode($('code2'));">复制代码</em></p>
<p>运行后我们可以得到以下结果：</p>
<div>
<blockquote><p>春哥横空出世了</p>
<p>春哥说：我是一个男人<br />
春哥使出了一招：霸气菊花残</p></blockquote>
</div>
<p>我们可以看到第一句话“春哥横空出世了”被输出了，虽然我们并<strong>没有访问构造方法</strong>，这是因为构造方法在<strong>创建对象时就被自动执行</strong>了。</p>
<p>虽然我们并<strong>没有在类的外部设置属性</strong>，但是后两句话依然输出了“春哥”的姓名、性别和技能属性，因为我们在构造方法中给了它们一个<strong>初始值</strong>，这个初始值就是我们<strong>传入的参数</strong>。当然，在有已经初始值的情况下，我们依然可以在类的外部重新设置“春哥”的属性。</p>
<p>好了，构造方法我们就完到这里，现在来我们开始玩<strong>析构方法</strong>，析构方法和构造方法正好<strong>相反</strong>，也就是在<strong>销毁对象时自动执行</strong>的方法，它是<strong>不带参数</strong>的，WHY？因为new一个对象的时候，后面只有一个括号，所以参数只能一个方法，而构造方法相对来说更加有用，所以就传给它咯，而且它可以为析构方法提供所需要的初始值。因此析构也不需要参数。析构方法通常用来执行一些善后工作。</p>
<p>构造方法的方法名称必须是 <strong>__destruct</strong>，注意前面也是<strong>两个下划线</strong>，这里要强调一下，PHP中凡是以双下划线开头的东东都有特殊作用。析构方法也是PHP5中的新改进，但是PHP4中没有析构方法，所以请不要尝试在PHP4中使用析构方法，否则电脑爆炸，后果自负，呵呵。</p>
<p>析构方法</p>
<div>
<div id="code3">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    function __destruct(); //析构方法</li>
<li>    {</li>
<li>        ……</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code3'));">复制代码</em></p>
<p>那么结合前面的代码，我们把析构方法加进去，也来玩玩析构方法的代码吧：</p>
<div>
<div id="code4">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    var $role_name; //角色的名字</li>
<li>    var $role_sex; //角色的性别</li>
<li>    var $role_skill; //角色的技能</li>
<li>    //方法部分</li>
<li>    function __construct($name,$sex,$skill) //构造方法，自动执行</li>
<li>    {</li>
<li>       $this-&gt;role_name = $name; //将参数传进来，给“姓名”属性一个初始值</li>
<li>       $this-&gt;role_sex = $sex; //将参数传进来，给“性别”属性一个初始值</li>
<li>       $this-&gt;role_skill = $skill; //将参数传进来，给“技能”属性一个初始值</li>
<li>       echo $this-&gt;role_name.&#8217;横空出世了&lt;br /&gt;&lt;br /&gt;&#8217;; //如果这句话被输出，说明构造方法自动执行了</li>
<li>    }</li>
<li>    function roleTalk() //角色说话</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;说：&#8217;.'我是一个&#8217;.$this-&gt;role_sex.&#8217;人&lt;br /&gt;&#8217;; //输出：(角色的名字)说：我是一个(角色的性别)人</li>
<li>    }</li>
<li>    function roleFight() //角色发招</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;使出了一招：&#8217;.$this-&gt;role_skill.&#8217;&lt;br  /&gt;&lt;br /&gt;&#8217;; //输出：(角色的名字)使出了一招(角色的技能)</li>
<li>    }</li>
<li>    function __destruct() //析构方法，自动执行</li>
<li>    {</li>
<li>         echo $this-&gt;role_name.&#8217;打完收招，只见天上的浮云组成了一个“纯”字&#8217;; //如果这句话被输出，说明析构方法自动执行了</li>
<li>    }</li>
<li>}</li>
<li>//实例化一个对象，同时将构造方法所需要的参数传入</li>
<li>$brother_chun = new Role(&#8216;春哥&#8217;,'男&#8217;,'霸气菊花残&#8217;);</li>
<li>//属性设置(因为我们我们已经在构造方法中给了属性初始值，所以不需要设置了)</li>
<li>//访问方法</li>
<li>$brother_chun-&gt;roleTalk();</li>
<li>$brother_chun-&gt;roleFight();</li>
</ol>
</div>
<p><em onclick="copycode($('code4'));">复制代码</em></p>
<p>运行后我们可以得到以下结果：</p>
<div>
<blockquote><p>春哥横空出世了</p>
<p>春哥说：我是一个男人<br />
春哥使出了一招：霸气菊花残</p>
<p>春哥打完收招，只见天上的浮云组成了一个“纯”字</p></blockquote>
</div>
<p>好啦，构造函数和析构函数我们就玩到这里，准备去看世界杯决赛了，虽然对于身为巴迷的我来说，巴西队被淘汰我的世界杯也就结束了，但是本届世界杯欧式足球的巅峰对决也不能错过啊。唉，邓叔啊邓叔，你硬是要活生生的把桑巴军团变成欧式球队吗？</p>
</div>
</div>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<p> </p>
<h2>第6玩——————来玩类的封装</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56631639"><em>本帖最后由 hetty 于 2010-7-12 16:55 编辑 </em>这里给大家一个小小的友情提示，由于论坛里的代码没有颜色提示，而代码里又含有大量详细的注释，虽然我已经仔细书写代码格式，但是在颜色相同的情况下，可能仍然不便于阅读。因此在代码太长导致大家眼花缭乱的时候，大家可以把代码复制下来，到有颜色提示的编辑器里阅读，比如Zend Studio、Deamweaver、Eclipse等等，这样感觉会好很多。</p>
<p>好，那么我们今天开始玩类的<strong>封装</strong>，什么是封装呢？额……就是<strong>封</strong>起来<strong>装</strong>(汗)， 其实大部分专业术语也很好从字面上的意思去理解，只不过绝大多数人一涉及到技术方面的问题，就习惯性的往高深的方向去想，其实没有必要，我们要尽量以我们自己容易理解的方式去想，这才是玩道，因为它们本就不是什么高深莫测的东西。</p>
<p>封装的作用是<strong>不允许</strong>别人随意从类的<strong>外部使用属性和方法</strong>，只留给别人一些<strong>有限的</strong>属性和方法去使用。OOP是<strong>鼓励使用封装</strong>的，那么到底封装有什么好处呢？很多书对于封装的好处三言两语就带过了，十分含糊，我在这里会尝试着给大家讲明白。</p>
<p>比如大家熟知的国内品牌机联想电脑，它就属于一种封装，对于不懂硬件的朋友来说，CPU、显卡、主板、硬盘、内存这些乱七八糟的硬件都被机箱<strong>封装</strong>起来了。机箱里面到底有些什么硬件？这些硬件对于电脑来说有些什么作用？它们到底是如何协同运转的？我们不需要去关心！因为我们只要会开机、会关机、会玩游戏就好了，这样我们的目的就达到了！但同时机箱里又提供了光驱、电源等<strong>有限的</strong>东西，方便我们可以从外部直接使用它们。</p>
<p>所以你说，一个封装的类，你拿过来，只需要知道怎么使用就可以了，根本不需要去关心它内部是怎么实现功能的，根本不需要去瞅那复杂的代码一眼，这是对于使用者来说的。</p>
<p>那么对于开发者来说呢？很多时候开发者不希望使用者能够随意去碰类内部的东西，因为那样可能会导致一些不可预料的事情发生，就像不懂硬件的朋友把机箱拆开，把里面硬件胡乱的拔来插去，那么电脑可能就无法启动，甚至烧坏，爆炸也说不定，这肯定不是开发者愿意看到的事情。</p>
<p>通常一个完整的系统是由无数个封装类构成的，它们每个都是一个独立的部分，但是又可以相互相通，这对于于团队开发、分工协作是十分有帮助的，比如说你做角色，我做地图，我要用角色的时候就直接就拿过来用，谁有闲功夫管你角色类里面都写了些什么代码，我自己的工作都还忙不过来呢；而且还大大的减少了排错的难度，就像电脑坏了，显卡坏了就修显卡，内存坏了就修内存，不需要把整个机箱里的硬件从头到尾修一遍，那还不如丢掉重新买一台。</p>
<p>所以说，我们要把<strong>尽多的</strong>工作交给<strong>类完成</strong>，把<strong>尽少的</strong>工作交给<strong>人完成</strong>，这才是正确的OOP主导思想。在类里面，属性和方法通常有<strong>公有</strong>的和<strong>私有</strong>的，又是些专业术语，不要紧张，我再次把它们通俗化：</p>
<p><strong>公有</strong>就是<strong>允许</strong>别人用<br />
<strong>私有</strong>就是<strong>不许</strong>别人用</p>
<p>在PHP中，类的属性和方法<strong>默认</strong>是<strong>公有</strong>的，但是我们不建议用默认的方式来定义公有的属性和方法，因为那不利于代码的可读性，我们从小要养成良好的编程习惯，我们要习惯用<strong>public</strong>访问修饰符来声明某个属性和方法是公有的。</p>
<p>请看下面两例代码，它们实际上是一样的，只不过一个是默认的，另一个是我们通过访问修饰符定义的。</p>
<p>默认方式(不建议使用)</p>
<div>
<div id="code0">
<ol>
<li>class 类的名称</li>
<li>{</li>
<li>    var $属性的名称; //没有访问修饰符，有var关键字</li>
<li>    function 方法的名称(参数列表) //没有访问修饰符</li>
<li>    {</li>
<li>        ……</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code0'));">复制代码</em></p>
<p>声明方式(建议使用)</p>
<div>
<div id="code1">
<ol>
<li>class 类的名称</li>
<li>{</li>
<li>    public $属性的名称; //有访问修饰符，var关键字被去掉了</li>
<li>    public function 方法的名称(参数列表) //有访问修饰符</li>
<li>    {</li>
<li>        ……</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code1'));">复制代码</em></p>
<p>注意：<strong>声明属性</strong>的时候，我们<strong>先要去掉var</strong>关键词，然后<strong>再前面加上访问修饰</strong>符public；<strong>声明方法</strong>的时候，<strong>直接在前面加上访问修饰符</strong>public即可。</p>
<p>我们来认识一下PHP类中的三个访问修饰符：</p>
<table cellspacing="0">
<tbody>
<tr>
<td>访问修饰符</td>
<td>声明类型</td>
<td>允许外部使用</td>
<td>允许子类使用</td>
</tr>
<tr>
<td>public</td>
<td>公有</td>
<td>是</td>
<td>是</td>
</tr>
<tr>
<td>protected</td>
<td>私有</td>
<td> </td>
<td>是</td>
</tr>
<tr>
<td>private</td>
<td>私有</td>
<td> </td>
<td> </td>
</tr>
</tbody>
</table>
<p>从上表我们可以看到，通过<strong>protected</strong>和<strong>private</strong>这两个访问修饰符可以将属性和方法声明为<strong>私有</strong>的，即将它们<strong>封装</strong>起来，<strong>不许</strong>别人用。它们的区别仅仅在于对子类的访问控制，关于子类我们会在后面类的继承里面讲到，现在不用去管它，我们现在的首要任务是跟这三个访问修饰符混个熟脸。</p>
<p>好，我们来玩一下代码，看看是不是真的是这么一回事情：</p>
<div>
<div id="code2">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    public $role_name; //角色的名字，请尝试将public换成protected或private进行封装</li>
<li>    //方法部分</li>
<li>    public function roleTalk() //角色说话，请尝试将public换成protected或private进行封装</li>
<li>    {</li>
<li>        echo &#8216;我会说话&#8217;;</li>
<li>    }</li>
<li>}</li>
<li>//实例化一个对象</li>
<li>$brother_chun = new Role();</li>
<li>//设置属性</li>
<li>$brother_chun-&gt;role_name = &#8216;春哥&#8217;;</li>
<li>//访问方法</li>
<li>$brother_chun-&gt;roleTalk();</li>
</ol>
</div>
<p><em onclick="copycode($('code2'));">复制代码</em></p>
<p>上面这段代码将属性和方法声明为<strong>public</strong>时，程序运行<strong>正常</strong>；若尝试将属性或方法的访问修饰符换成<strong>protected</strong>和<strong>private</strong>，那么程序就会<strong>报错</strong>。因为私有的属性和方法是不允许从类的外部使用的。大家可以自己去亲自试验一下，体会一下，这样可以加深理解。那……今天就玩到这里吧。</p>
</div>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<p> </p>
<h2>第7玩——————来玩类的特殊方法</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56762263">Sorry，最近比较忙，比较忙比较忙……没有及时更新，希望大家多多谅解，这些<strong>特殊方法</strong>你也可以叫它们做<strong>特殊函数</strong>，因为我们前面说过了，方法就是类里面的函数。实际上前面我们已经玩过两个特殊方法了，还记得吗？就是<strong>构造方法</strong>和<strong>析构方法</strong>，即<strong>__construct</strong>和<strong>__destruct</strong>这两个方法。那么希望大家记住，PHP类里面凡是以<strong>双下划线开头</strong>的方法，都<strong>有特殊作用</strong>，并且都会<strong>自动执行</strong>。今天我们就来玩<strong>另外四个</strong>特殊方法，它们分别是：<strong>__set()</strong>、<strong>__get()</strong>、<strong>__isset()</strong>和<strong>__unset()</strong></p>
<p>大家注意，之前因为还没有讲到这些特殊方法，同时也是为了方便演示，很多代码中属性都是用默认的public作为声明的，既然现在我们开始玩这些新知识了，那么在此声明，我们<strong>不建议将属性声明为默认的public</strong>。</p>
<p>一般情况下，<strong>直接从类的外部访问和设置属性</strong>是个很糟糕的想法，因为我们说过了，OOP的优点是<strong>封装</strong>，而且鼓励使用封装，因此我们在声明属性的时候，应该使用<strong>private</strong>或<strong>protected</strong>，这更符合OOP的编程思想和现实的逻辑。但是，很多情况下我们仍然需要访问和设置属性，而且是经常性的，于是PHP为我们提供了两个方法，用<strong>__get()</strong>来<strong>访问属性</strong>，用<strong>__set()</strong>来<strong>设置属性</strong>。</p>
<p>我们先通过代码来看看它们是怎么用的，然后再来分析，请结合注释仔细看：</p>
<div>
<div id="code0">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    private $role_name; //封装：角色的名字</li>
<li>    private $role_sex; //封装：角色的性别</li>
<li>    private $role_skill; //封装：角色的技能</li>
<li>    //方法部分</li>
<li>    private function __get($attribute_name) //允许访问属性(有一个参数：传入属性的名称)</li>
<li>    {</li>
<li>        if($attribute_name == &#8216;role_name&#8217; || $attribute_name == &#8216;role_sex&#8217;) //如果是：名字、性别</li>
<li>        {</li>
<li>            return $this-&gt;$attribute_name; //就允许访问</li>
<li>        }</li>
<li>    }</li>
<li>        </li>
<li>    private function __set($attribute_name,$attribute_value) //允许设置属性(有两个参数：传入属性的名称和值)</li>
<li>    {</li>
<li>        if($attribute_name == &#8216;role_name&#8217; || $attribute_name == &#8216;role_sex&#8217;) //如果是：名字、性别</li>
<li>        {</li>
<li>            $this-&gt;$attribute_name = $attribute_value; //就允许设置</li>
<li>        }</li>
<li>    }</li>
<li>}</li>
<li>//将角色类实例化得到一个对象</li>
<li>$brother_chun = new Role();</li>
<li>//设置属性</li>
<li>$brother_chun-&gt;role_name = &#8216;春哥&#8217;; //可以设置：姓名</li>
<li>$brother_chun-&gt;role_sex = &#8216;男&#8217;; //可以设置：性别</li>
<li>$brother_chun-&gt;role_skill = &#8216;霸气菊花残&#8217;; //无法设置：技能</li>
<li>//访问属性</li>
<li>echo $brother_chun-&gt;role_name.&#8217;&lt;br /&gt;&#8217;; //可以访问：姓名</li>
<li>echo $brother_chun-&gt;role_sex.&#8217;&lt;br /&gt;&#8217;; //可以访问：性别</li>
<li>echo $brother_chun-&gt;role_skill.&#8217;&lt;br /&gt;&#8217;; //无法访问：技能</li>
</ol>
</div>
<p><em onclick="copycode($('code0'));">复制代码</em></p>
<p>不要看到代码就烦哦，我刚学编程的时候也是这样，这是个坏习惯，因为无论你的理论基础有多么的扎实，如果看不懂代码那也是白搭，更不要说去写了。养成分析代码的好习惯，尤其是去看别人写的优秀的代码，那样会使自己进步非常快。</p>
<p>注意：这里参数是<strong>带$号</strong>的，关于这个问题貌似“PHP圣经”又写错了几个例子，在此提醒大家，请与属性做好区别。</p>
<p><strong>参数：</strong>$this-&gt;<strong>$</strong>something<br />
<strong>属性：</strong>$this-&gt;something</p>
<p><strong>__get()</strong>方法用于<strong>访问属</strong>性，当我们试图访问一个属性的时候，它会自动将属性的名称作为参数传入，并且返回属性的值。<br />
<strong>__set()</strong>方法用于<strong>设置属性</strong>，当我们试图设置一个属性的时候，它会自动将属性的名称和值作为参数传入并执行设置操作，没有返回值。</p>
<p>通过运行代码我们会发现，虽然所有属性都被声明为<strong>private</strong>，即<strong>封装</strong>为<strong>私有</strong>属性，但是通过__get()方法和__set()方法，我们可以允许某些属性(姓名、性别)能够被访问或设置，并且可以定制一些个性化的<strong>条件控制</strong>属性的访问和设置，比如我们只允许把性别设置成“男”或“女”，而不能设置为“人妖”等等。如果我们删除这两个特殊方法，试图直接访问或设置属性，那么程序就会报错。</p>
<p>好，那么这两个特殊方法就玩到这里，请大家多看代码和注释，并且尝试修改程序，通过这种方式来进一步了解它们。</p>
<p>下面玩<strong>__isset()</strong>和<strong>__unset()</strong>这两个特殊方法，我们在原有代码的基础上新增几行代码：</p>
<div>
<div id="code1">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    private $role_name; //封装：角色的名字</li>
<li>    private $role_sex; //封装：角色的性别</li>
<li>    private $role_skill; //封装：角色的技能</li>
<li>    //方法部分</li>
<li>    private function __get($attribute_name) //允许访问属性(有一个参数：传入属性的名称)</li>
<li>    {</li>
<li>        if($attribute_name == &#8216;role_name&#8217; || $attribute_name == &#8216;role_sex&#8217;) //如果是：名字、性别</li>
<li>        {</li>
<li>            return $this-&gt;$attribute_name; //就允许访问</li>
<li>        }</li>
<li>    }</li>
<li>        </li>
<li>    private function __set($attribute_name,$attribute_value) //允许设置属性(有两个参数：传入属性的名称和值)</li>
<li>    {</li>
<li>        if($attribute_name == &#8216;role_name&#8217; || $attribute_name == &#8216;role_sex&#8217;) //如果是：名字、性别</li>
<li>        {</li>
<li>            $this-&gt;$attribute_name = $attribute_value; //就允许设置</li>
<li>        }</li>
<li>    }</li>
<li>    //新增部分</li>
<li>    private function __isset($attribute_name) //检测属性是否设置(有一个参数：传入属性的名称)</li>
<li>    {</li>
<li>        return $this-&gt;$attribute_name; //返回结果</li>
<li>    }</li>
<li>        </li>
<li>    private function __unset($attribute_name) //删除属性(有一个参数：传入属性的名称)</li>
<li>    {</li>
<li>        unset($this-&gt;$attribute_name); //进行删除</li>
<li>    }</li>
<li>}</li>
<li>//将角色类实例化得到一个对象</li>
<li>$brother_chun = new Role();</li>
<li>//设置属性</li>
<li>$brother_chun-&gt;role_name = &#8216;春哥&#8217;; //可以设置：姓名</li>
<li>$brother_chun-&gt;role_sex = &#8216;男&#8217;; //可以设置：性别</li>
<li>$brother_chun-&gt;role_skill = &#8216;霸气菊花残&#8217;; //无法设置：技能</li>
<li>//访问属性</li>
<li>echo $brother_chun-&gt;role_name.&#8217;&lt;br /&gt;&#8217;; //可以访问：姓名</li>
<li>echo $brother_chun-&gt;role_sex.&#8217;&lt;br /&gt;&#8217;; //可以访问：性别</li>
<li>echo $brother_chun-&gt;role_skill.&#8217;&lt;br /&gt;&#8217;; //无法访问：技能</li>
<li>//新增部分</li>
<li>echo var_dump(isset($brother_chun-&gt;role_name)); //检测并输出变量是否被设置</li>
<li>unset($brother_chun-&gt;role_name); //删除此属性</li>
<li>echo $brother_chun-&gt;role_name.&#8217;&lt;br /&gt;&#8217;; //由于属性被删除，因此没有输出</li>
</ol>
</div>
<p><em onclick="copycode($('code1'));">复制代码</em></p>
<p><strong>__isset()</strong>和<strong>__unset()</strong>这两个特殊方法的原理和__get()和set()方法的原理是一样的，即将属性作为参数传入，并在类的内部进行处理。说白了，这两个特殊方法就是为了方便在属性被封装的情况下，允许在类的外部使用isset()和unset()这两个PHP函数，更多的也没有什么好说的了，大家看代码和注释吧，尝试着修改运行看看，OK，今天就玩到这里。</p>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<p> </p>
<h2>第8玩——————来玩类的继承</h2>
<div>
<table cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td id="postmessage_56992870"><em>本帖最后由 hetty 于 2010-7-20 03:09 编辑 </em></p>
<p>继承是怎么一个情况呢？和遗传有点相似，但是又不完全相同，比如<strong>儿子</strong>可以<strong>继承父亲的</strong>特征，而且还可以<strong>拥有自己的</strong>特征；同样的<strong>子类</strong>可以<strong>继承父类的</strong>属性和方法，而且还可以<strong>拥有自己的</strong>属性和方法。但是要注意一点，类的世界里面只有”父子关系“，毕竟类不是真实的动物，会有公的和母的之分，还要交配才产下子类，没有这种事情，这只是一个形象的比喻而已。由一个基本的类派生出另一个类，那么这个基本的类就是父类，它所派生出来的类就叫做子类，所以请看下面。</p>
<p><strong>父类</strong>也可以叫<strong>超类</strong><br />
<strong>子类</strong>也可以叫<strong>派生类</strong></p>
<p>如果你觉得我有性别歧视的嫌疑，当然你也可以叫它们母类和女类，怎么叫无所谓，反正它们是“单性繁殖”，只要理解这点就可以了。想想平时你接触得最多的文件夹，根目录和子目录的关系就和这个道理差不多了……连我自己都觉得啰嗦了，主要是多照顾初学者朋友们，先上图吧，看看更健康。</p>
<p>在PHP和JAVA等大多数语言中，类只允许<strong>单继承</strong>，也就是说<strong>一个子类只能有一个父类</strong>；而在C++等一些语言中，类允许<strong>多继承</strong>，也就是说<strong>一个子类可以有多个父类</strong>。我个人觉得单继承更符合现实的逻辑，而且我们现在玩的是PHP的OOP，就不对多继承进行过多的讨论了。<br />
<a href="http://fugui.in/wp-content/uploads/2010/08/Jichenga.gif"><img class="alignnone size-full wp-image-718" title="Jichenga" src="http://fugui.in/wp-content/uploads/2010/08/Jichenga.gif" alt="" width="500" height="500" /></a><br />
 </p>
<div id="aimg_128483_menu">
<p>也不妨来看看多继承的图，顺便了解下吧：</p>
</div>
<p> <a href="http://fugui.in/wp-content/uploads/2010/08/jichengb.gif"><img class="alignnone size-full wp-image-719" title="jichengb" src="http://fugui.in/wp-content/uploads/2010/08/jichengb.gif" alt="" width="500" height="227" /></a></p>
<div id="aimg_128486_menu">
<div> </div>
</div>
<p>前面说了，我个人觉得多继承是不符合现实的逻辑的，就是上图所示的样子。但是多继承这个功能是十分有用的，所以PHP为我们引入了接口，接口可以解决多继承的问题，同时又符合了现实的逻辑。关于接口这个东东，我们会在后面的章节中讲解。</p>
<p>现在图看完了，那么打起精神来看代码吧，为了便于演示和便于大家理解，我把所有属性和方法都声明为了public，再次重声，我们不建议这么做：</p>
<div>
<div id="code0">
<ol>
<li>class Role //角色类</li>
<li>{</li>
<li>    //属性部分</li>
<li>    public $role_name; //名字</li>
<li>    //方法部分</li>
<li>    public function roleTalk() //说话</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;：我会说话&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>        </li>
<li>    public function roleFight() //发招</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;：我会发招&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>}</li>
<li>class RoleSon extends Role //角色儿子类 继承 角色类</li>
<li>{</li>
<li>    //方法部分</li>
<li>    public function roleEat() //吃饭(儿子类自己的方法)</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;：我会吃饭(儿子特有)&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>}</li>
<li>class RoleGrandson extends RoleSon //角色孙子类 继承 角色儿子类</li>
<li>{</li>
<li>    //方法部分</li>
<li>    public function roleShit() //拉屎(孙子类自己的方法)</li>
<li>    {</li>
<li>        echo $this-&gt;role_name.&#8217;：我会拉屎(孙子特有)&lt;br /&gt;&#8217;;</li>
<li>    }</li>
<li>}</li>
<li>//实例化角色类</li>
<li>$brother_chun = new Role();</li>
<li>$brother_chun-&gt;role_name = &#8216;春哥&#8217;;</li>
<li>$brother_chun-&gt;roleTalk();</li>
<li>$brother_chun-&gt;roleFight();</li>
<li>//实例化角色儿子类</li>
<li>$brother_chun_son = new RoleSon();</li>
<li>$brother_chun_son-&gt;role_name = &#8216;春哥之子&#8217;;</li>
<li>$brother_chun_son-&gt;roleTalk();</li>
<li>$brother_chun_son-&gt;roleFight();</li>
<li>$brother_chun_son-&gt;roleEat();</li>
<li>//实例化角色孙子类</li>
<li>$brother_chun_grandson = new RoleGrandson();</li>
<li>$brother_chun_grandson-&gt;role_name = &#8216;春哥之孙&#8217;;</li>
<li>$brother_chun_grandson-&gt;roleTalk();</li>
<li>$brother_chun_grandson-&gt;roleFight();</li>
<li>$brother_chun_grandson-&gt;roleEat();</li>
<li>$brother_chun_grandson-&gt;roleShit();</li>
</ol>
</div>
<p><em onclick="copycode($('code0'));">复制代码</em></div>
<p>从上面的代码我们已经可以看出继承一个类的步骤非常简单，在子类的名称后面加上<strong>extends</strong>关键词，再跟上所要继承的父类的名称即可：</p>
<div>
<div id="code1">
<ol>
<li>class 子类的名称 extends 父类的名称</li>
<li>{</li>
<li>    ……</li>
<li>}</li>
</ol>
</div>
<p><em onclick="copycode($('code1'));">复制代码</em></div>
<p>我们来看看示例代码的输出结果：</p>
<div>
<div id="code2">
<ol>
<li>春哥：我会说话</li>
<li>春哥：我会发招</li>
<li>春哥之子：我会说话</li>
<li>春哥之子：我会发招</li>
<li>春哥之子：我会吃饭(儿子特有)</li>
<li>春哥之孙：我会说话</li>
<li>春哥之孙：我会发招</li>
<li>春哥之孙：我会吃饭(儿子特有)</li>
<li>春哥之孙：我会拉屎(孙子特有)</li>
</ol>
</div>
<p><em onclick="copycode($('code2'));">复制代码</em></div>
<p>我们能发现子类不但可以继承父类的属性和方法，也可以拥有自己的属性和方法。如果我们尝试用“春哥”去访问子类的特有方法，那么程序就会报错。</p>
<p>“春哥之孙”虽然仅仅是继承了“春哥之子”，但是由于“春哥之子”继承了“春哥”，所以“春哥之孙”同时拥有它两个祖宗的属性和方法。</p>
<p>所以说继承这个东东是十分好用啊，你可以利用一个父类来派生出无数个功能更加强大或有特殊用途的子类来。比如把“人类”定义为一个父类，那么通过类的继承，按照性别就可以派生出“男人类”和“女人类”，按照人品就可以派生出“好人类”和“坏人类”，按照职业就可以派生出“工人类”和“农民类”……如此这般，他们同是人类，但又有各自的特点。</p>
<p>以上，什么代码重用易于维护之类老生常谈的好处我就不多说了，大家自己慢慢体会吧，今天就玩到这里。</td>
</tr>
</tbody>
</table>
</div>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/716.aspx/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>站长与交警</title>
		<link>http://fugui.in/709.aspx</link>
		<comments>http://fugui.in/709.aspx#comments</comments>
		<pubDate>Sat, 31 Jul 2010 05:37:27 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[我的生活]]></category>
		<category><![CDATA[穷站长]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=709</guid>
		<description><![CDATA[站长没钱，每天只能骑自行车上下班 不过这也练就了哥骑车的本领 哥双手不用掌把，也可以把自行车骑的加平八稳 今早哥去上班的路上遇到一美女也骑车上班， 哥是一路相陪呀 为了让美女注意哥 哥决定表演一下哥的骑车绝技“双手脱把骑车” 这下果真让引来美女的关注（不停的含笑向我行注目礼，哥那个美呀） 可也引来的交警的注意 过十字路口时老远就听到交警和我打招呼 交警“喂，首长好吧（手掌好把）” 我也不含糊的回了一句；“同志们好，同志们辛苦了”]]></description>
			<content:encoded><![CDATA[<p>站长没钱，每天只能骑自行车上下班<br />
不过这也练就了哥骑车的本领<br />
哥双手不用掌把，也可以把自行车骑的加平八稳</p>
<p>今早哥去上班的路上遇到一美女也骑车上班，<br />
哥是一路相陪呀<br />
为了让美女注意哥<br />
哥决定表演一下哥的骑车绝技“双手脱把骑车”<br />
这下果真让引来美女的关注（不停的含笑向我行注目礼，哥那个美呀）<br />
可也引来的交警的注意<br />
过十字路口时老远就听到交警和我打招呼</p>
<p>交警“喂，首长好吧（手掌好把）”<br />
我也不含糊的回了一句；“同志们好，同志们辛苦了”</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/709.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>宁愿睡地板，也要当老板，思路决定出路</title>
		<link>http://fugui.in/705.aspx</link>
		<comments>http://fugui.in/705.aspx#comments</comments>
		<pubDate>Fri, 30 Jul 2010 14:43:39 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[我的生活]]></category>
		<category><![CDATA[创业]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=705</guid>
		<description><![CDATA[发现很多朋友创业的心里很矛盾，既有创业单干的激情，同时又有担心失败后悲惨的命运！所以很多朋友思考了很长时间，最后还是决定等等再看，一月过了一月，一年过了又一年，岁月流逝，光阴不再，沉浸在打工的生涯中难以自拔，结婚供房，身上的经济枷锁日益沉重，无力再搏，最后只好认命，打工一辈子。]]></description>
			<content:encoded><![CDATA[<p>发现很多朋友创业的心里很矛盾，既有创业单干的激情，同时又有担心失败后悲惨的命运！所以很多朋友思考了很长时间，最后还是决定等等再看，一月过了一月，一年过了又一年，岁月流逝，光阴不再，沉浸在打工的生涯中难以自拔，结婚供房，身上的经济枷锁日益沉重，无力再搏，最后只好认命，打工一辈子。</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/705.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IE 输入baidu就死掉</title>
		<link>http://fugui.in/701.aspx</link>
		<comments>http://fugui.in/701.aspx#comments</comments>
		<pubDate>Sun, 25 Jul 2010 06:42:26 +0000</pubDate>
		<dc:creator>PHP</dc:creator>
				<category><![CDATA[互联网观察]]></category>
		<category><![CDATA[IE自动关闭]]></category>

		<guid isPermaLink="false">http://fugui.in/?p=701</guid>
		<description><![CDATA[IE输入baidu 这几个字母 马上就会自动关闭,一直这样困扰着我,  后来慢慢发现,输入一个网址 ie联想功能 会自动出现一个下拉菜单可以选择, 当输入baidu时候,百度搜索的内容的网址会在里面,应该是这个使IE关闭的.终于找到解决办法了,禁用这个功能就应该可以了. 默认的IE8地址栏中增加了显示历史记录和收藏夹的功能，方便更快捷的选择要访问的站点，但部分网址可能包含特殊字符,使不成熟的IE遇到会崩溃. 把这个自动完成的功能禁用就好了. 1、打开IE选择工具 Internet选项 2、选择  内容 自动完成 设置 3、将地址栏下的浏览历史记录和收藏夹前的对勾去掉即可 4、地址栏还原成最初的原始状态了]]></description>
			<content:encoded><![CDATA[<p><strong>IE输入baidu 这几个字母 马上就会自动关闭,一直这样困扰着我,  后来慢慢发现,输入一个网址 ie联想功能 会自动出现一个下拉菜单可以选择,<br />
当输入baidu时候,百度搜索的内容的网址会在里面,应该是这个使IE关闭的.终于找到解决办法了,禁用这个功能就应该可以了.</strong></p>
<p>默认的IE8地址栏中增加了显示历史记录和收藏夹的功能，方便更快捷的选择要访问的站点，但部分网址可能包含特殊字符,使不成熟的IE遇到会崩溃.<br />
把这个自动完成的功能禁用就好了.</p>
<p>1、打开IE选择工具 Internet选项<br />
2、选择  内容 自动完成 设置<br />
3、将地址栏下的浏览历史记录和收藏夹前的对勾去掉即可<br />
4、地址栏还原成最初的原始状态了</p>
]]></content:encoded>
			<wfw:commentRss>http://fugui.in/701.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
