﻿<?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/"
	>

<channel>
	<title>无忧岛</title>
	<atom:link href="http://www.islandcn.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.islandcn.com</link>
	<description>其实天空一直很蓝,只是你许久没有仰望了</description>
	<pubDate>Thu, 12 Aug 2010 00:44:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>php面向对象OOP编程教程(九) - 类的重载</title>
		<link>http://www.islandcn.com/post/820.html</link>
		<comments>http://www.islandcn.com/post/820.html#comments</comments>
		<pubDate>Thu, 12 Aug 2010 00:42:34 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[教程]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[重载]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=820</guid>
		<description><![CDATA[在PHP中，函数是不能重名的，同一个类中方法也不能重名，我们这里所说的重载，是指子类方法与父类方法以同名的方式对父类方法进行覆盖。很多时候，子类可以继承父类的方法直接拿过来用，但是有一些时候，子类需要覆盖父类原有的方法]]></description>
			<content:encoded><![CDATA[<p>在PHP中，函数是不能重名的，同一个类中方法也不能重名，我们这里所说的<strong>重载</strong>，是指<strong>子类方法</strong>与<strong>父类方法</strong>以<strong>同名</strong>的方式对父类方法进行<strong>覆盖</strong>。很多时候，子类可以继承父类的方法直接拿过来用，但是有一些时候，子类需要覆盖父类原有的方法，为自己扩展一些新功能。我们通过代码来分析，同样要注意看注释部分哦：</p>
<pre name="code" class="php">

class Role //角色类
{
    //属性部分
    public $role_name; //名字

    //方法部分
    public function roleTalk() //说话
    {
        echo &#039;我的名字叫：&#039;.$this-&gt;role_name.&#039;&lt;br /&gt;&#039;;
    }
}

class RoleSon extends Role //角色儿子类 继承 角色类
{
    //属性部分
    public $role_nickname; //小名(新的属性)
       
    //方法部分
    public function roleTalk() //说话(重载覆盖)
    {
        echo &#039;我的名字叫：&#039;.$this-&gt;role_name.&#039;&lt;br /&gt;&#039;;
        echo &#039;我的小名叫：&#039;.$this-&gt;role_nickname.&#039;&lt;br /&gt;&#039;;
    }
}

//实例化角色类
$brother_chun = new Role();
$brother_chun-&gt;role_name = &#039;春哥&#039;; //名字
$brother_chun-&gt;roleTalk(); //父类原有方法

//实例化角色儿子类
$brother_chun_son = new RoleSon();
$brother_chun_son-&gt;role_name = &#039;春哥之子&#039;; //名字
$brother_chun_son-&gt;role_nickname = &#039;狗胜&#039;; //小名(儿子特有)
$brother_chun_son-&gt;roleTalk(); //子类覆盖方法
</pre>
<p>以上代码将输出：</p>
<blockquote><p>我的名字叫：春哥<br />
我的名字叫：春哥之子<br />
我的小名叫：狗胜</p></blockquote>
<p>通过上面的代码我们可以看到，<strong>子类</strong>里有一个新的属性<strong>$role_nickname</strong>，这个子类里的属性是无法被<strong>父类</strong>的<strong>roleTalk()</strong>方法访问的，如果子类通过继承直接使用roleTalk()方法话，那么新的属性就会毫无用处了，因此我们可以通过在子类里建立一个与父类同名的方法来<strong>重载</strong>，即<strong>覆盖</strong>父类原有的方法来达到我们的目的——让春哥之子说出自己的小名。</p>
<p>那么有人可能就要问了，我们在子类重新定义一个说话的新方法，比如newRoleTalk()不就得了？效果还不是一样。但是我必须告诉大家，最好不要这么做，因为这不符合现实的逻辑，就好像一个人只有一个嘴巴，我们不可能为了让人多说一句话就多长一个嘴巴，设想如果春哥真长出了N个嘴巴，我们就不用等到2012世界末日了对不对？</p>
<p>那么又有人要问了，roleTalk()原有方法里面只有一行代码，我们要利用重载来扩展一些新功能十分容易搞定，如果roleTalk()里面有成百上千行代码的话，而且父类代码是封装的我们无法查看，那事情不就大条了？的确是这样的，但是不要着急，PHP为我们提供了完美的解决方案来调用父类方法的原有代码，只需要在重载时添加新的代码即可，方法如下：</p>
<p>方法一(建议使用)</p>
<pre name="code" class="php">

parent::方法的名称();
</pre>
<p>方法二(不建议使用)</p>
<pre name="code" class="php">

父类的名称::方法的名称();
</pre>
<p>完整代码如下：</p>
<pre name="code" class="php">

class Role //角色类
{
    //属性部分
    public $role_name; //名字

    //方法部分
    public function roleTalk() //说话
    {
        echo &#039;我的名字叫：&#039;.$this-&gt;role_name.&#039;&lt;br /&gt;&#039;;
    }
}

class RoleSon extends Role //角色儿子类 继承 角色类
{
    //属性部分
    public $role_nickname; //小名(新的属性)
       
    //方法部分
    public function roleTalk() //说话(重载)
    {
        parent::roleTalk(); //父类方法原有的代码
        echo &#039;我的小名叫：&#039;.$this-&gt;role_nickname.&#039;&lt;br /&gt;&#039;; //子类方法新增的代码
    }
}

//实例化角色类
$brother_chun = new Role();
$brother_chun-&gt;role_name = &#039;春哥&#039;; //名字
$brother_chun-&gt;roleTalk(); //父类原有方法

//实例化角色儿子类
$brother_chun_son = new RoleSon();
$brother_chun_son-&gt;role_name = &#039;春哥之子&#039;; //名字
$brother_chun_son-&gt;role_nickname = &#039;狗胜&#039;; //小名(儿子特有)
$brother_chun_son-&gt;roleTalk(); //子类覆盖方法
</pre>
<p>以上代码依然将输出：</p>
<blockquote><p>我的名字叫：春哥<br />
我的名字叫：春哥之子<br />
我的小名叫：狗胜</p></blockquote>
<p>这样一来，我们就可以轻松的利用重载为原有方法扩展新功能了。OK，那么今天就玩到这里，再次感谢大家的支持，我会抽时间尽力尽快更新的。</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank"><span style="color: #319bd8;">http://www.im286.com/thread-4823948-1-1.html</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/820.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>DotA 6.68预告:CM模式改动,英雄Tiny(小小)和道具物品改动</title>
		<link>http://www.islandcn.com/post/818.html</link>
		<comments>http://www.islandcn.com/post/818.html#comments</comments>
		<pubDate>Mon, 26 Jul 2010 07:11:50 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Dota]]></category>

		<category><![CDATA[6.68]]></category>

		<category><![CDATA[dota]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=818</guid>
		<description><![CDATA[DotA 6.68预告:CM模式改动,英雄Tiny(小小)和道具物品改动]]></description>
			<content:encoded><![CDATA[<p> </p>
<div id="post_message_1402711" style="WORD-WRAP: break-word">新版本就快要完成了,将会有很多新英雄,新道具和平衡性改动,以下是预览#2:</div>
<p>1.<span style="color: orange;">队长模式(Captains Mode)</span>(即-cm):6.68的CM模式中将会有一个全新的Ban&amp;Pick系统.<br />
旧系统:<span style="color: blue;">4个Ban然后是5个Pick.</span><br />
新系统:<span style="color: lime;">3个Ban3个Pick,完成后再进行2个Ban和2个Pick.</span><br />
关于具体的Ban&amp;Pick顺序将会在Changelog中详细介绍.</p>
<p>2.一个新道具,<span style="color: orange;">毒液之球(Orb of Venom)</span>.<br />
<img class="tcattdimgresizer" src="http://beta.getdota.com/BTNOrbOfVenom.JPG" border="0" alt="" /></p>
<p>3.Tiny将会从<span style="color: orange;">A杖</span>加成中获得一个新技能.<br />
<img class="tcattdimgresizer" src="http://beta.getdota.com/tiny.png" border="0" alt="" /></p>
<p>4.<span style="color: orange;">动力场(Kinetic Field)</span>,一个新英雄的新技能之一.<br />
<img class="tcattdimgresizer" src="http://beta.getdota.com/KineticField.gif" border="0" alt="" /></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
PS:动力场为个人翻译&#8230;官方翻译请等待官方内幕组组长的内幕&#8230;</p>
<div style="WORD-WRAP: break-word">原文地址:<a href="http://www.playdota.com/forums/274490/6-68-2-cm-item-tiny/" target="_blank">http://www.playdota.com/forums/274490/6-68-2-cm-item-tiny/</a></div>
<p><!-- / message --><!-- sig --></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/818.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[视频]DotA 6.68预告片,DotA 6.68新英雄和改动详解</title>
		<link>http://www.islandcn.com/post/810.html</link>
		<comments>http://www.islandcn.com/post/810.html#comments</comments>
		<pubDate>Mon, 26 Jul 2010 06:49:21 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Dota]]></category>

		<category><![CDATA[6.68]]></category>

		<category><![CDATA[dota]]></category>

		<category><![CDATA[改动]]></category>

		<category><![CDATA[新英雄]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=810</guid>
		<description><![CDATA[万众期待的DotA 6.68预告片终于放出啦!
新的金钱系统,新的英雄,小小有了蓝杖后的新技能,均在片中一一呈现.我们有理由相信6.68的发布时间指日可待.
]]></description>
			<content:encoded><![CDATA[<p><embed src="http://player.youku.com/player.php/sid/XMTkyNzA1MTYw/v.swf" quality="high" width="430" height="380" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed></p>
<p>万众期待的DotA 6.68预告片终于放出啦!<br />
新的金钱系统,新的英雄,小小有了蓝杖后的新技能,均在片中一一呈现.我们有理由相信6.68的发布时间指日可待.<br />
从视频中看到的部分画面:</p>
<blockquote><p>
1.拿着大棒子的小小(估计是出了蓝杖了的效果)<br />
2.华丽的仙女龙<br />
3.用直升飞机攻击的英雄<br />
4.一些尚未清楚的新英雄<br />
5.很多华丽的技能效果
</p></blockquote>
<p>慢慢欣赏吧.</p>
<p>视频转载自:<a href="http://www.youtube.com" target="_blank">YouTube</a><br />
http://www.youtube.com/watch?v=LNTT5J54V7w&#038;feature=player_embedded</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/810.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[视频]dota 6.67C bug小鸡希瓦war3报错bug</title>
		<link>http://www.islandcn.com/post/802.html</link>
		<comments>http://www.islandcn.com/post/802.html#comments</comments>
		<pubDate>Fri, 23 Jul 2010 10:13:08 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Dota]]></category>

		<category><![CDATA[bug]]></category>

		<category><![CDATA[dota]]></category>

		<category><![CDATA[war3]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=802</guid>
		<description><![CDATA[[视频]dota 6.67C bug,RD模式选人英雄活动bug以及小鸡希瓦war3出错的bug]]></description>
			<content:encoded><![CDATA[<p>继上文<a href="http://www.islandcn.com/post/795.html" target="_blank">让鸟带有攻击力</a>的bug之后又搜集了两个<a href="http://www.islandcn.com/post/802.html">dota 6.67C的bug</a>.</p>
<p>此视频中有两个bug,操作方法在视频中也有讲解:</p>
<p><strong>一是RD模式 未被选的人物会动起来的bug</strong></p>
<blockquote><p>
此bug对实战毫无影响的,但是挺有意思,那么如何实现的呢,我们接下来讲解:<br />
首先你自己必须已经选完英雄.<br />
先选中RD圈中的模型,就是未被选的英雄,然后同时按下SHIFT+CTRL键,点击你自己的英雄头像,就可以同时选中模型和英雄,这时候你看到队伍栏里有了2个单位.<br />
使用TAB切换,然后用M键移动,然后用M(指令move)点地方就可以了,模型会缓慢移动,英雄也会往那个方向移动.<br />
先选中你想移动的英雄,注意是还没被人选掉的那些&#8230;
</p></blockquote>
<p><strong>第二个bug也叫小鸡希瓦bug</strong></p>
<blockquote><p>此bug也是比较邪恶的bug,浩方和vs均有人测试过.<br />
小鸡BUG 比之前的小鸡臂章 更牛 次BUG 不需要队友的配合 自己独立可完成</p>
<p>当然了 所需的金钱会比小鸡臂章贵 需要小鸡 西瓦 艺人面罩 守护指环 精气球 或者能量球（主要是为了让小鸡有蓝可以使用西瓦而已）</p>
<p>1.合出西瓦<br />
2.给鸡一个守护指环和一个精气球 或者能量球 摁住SHIFT 拿远处的艺人面罩 并按一下C 小鸡身上的圣殿不会合成<br />
3.把西瓦放在小鸡身上,并使用 WAR3 报错,VS对战平台实际bug效果如下图</p>
<div class="wp-caption alignnone" style="width: 369px"><img title="dota 6.67C 小鸡希瓦bug" src="../wp-content/uploads/2010/07/dota-6.67-bug.png" alt="dota 6.67C 小鸡希瓦bug" width="359" height="105" /><p class="wp-caption-text">dota 6.67C 小鸡希瓦bug</p></div></blockquote>
<p><object width="430" height="380" data="http://player.youku.com/player.php/sid/XMTc1NTA2NjI0/v.swf" type="application/x-shockwave-flash"><param name="align" value="middle" /><param name="src" value="http://player.youku.com/player.php/sid/XMTc1NTA2NjI0/v.swf" /><param name="quality" value="high" /></object><br />
<strong><a href="http://www.islandcn.com/post/802.html">6.67C bug 小鸡希瓦</a></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/802.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>[视频]DotA 6.67c BUG,DotA最新BUG,让鸟带有攻击力</title>
		<link>http://www.islandcn.com/post/795.html</link>
		<comments>http://www.islandcn.com/post/795.html#comments</comments>
		<pubDate>Fri, 23 Jul 2010 09:17:35 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Dota]]></category>

		<category><![CDATA[bug]]></category>

		<category><![CDATA[dota]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=795</guid>
		<description><![CDATA[DotA 6.67c BUG,DotA最新BUG,让鸟带有攻击力.一个来自youtube的视频,DOTA 6.67C的一个小BUG,由Dustbringer发现并制作视频.]]></description>
			<content:encoded><![CDATA[<p>一个来自youtube的视频,DOTA 6.67C的一个小BUG,由Dustbringer发现并制作视频.<br />
<a href="http://www.islandcn.com/post/795.html">DotA 6.67C bug</a>大概触发步骤是:</p>
<blockquote><p>1. 选择一名英雄<br />
2. 买一个散华放在地上<br />
3. 买一个夜叉放在地上<br />
4. 买一个小鸡卷轴变鸡<br />
5. 买一个小鸟卷轴放在小鸡身上<br />
6. 让小鸡先去拿夜叉-&gt;按住shift拿散华-&gt;按住shift点F(变鸟)<br />
然后你的小鸟就有了35-41的攻击力,但是它只能攻击飞行单位,因为是魔法攻击,所以对面的鸟和大飞龙这些受免疫单位是不能被攻击的。剩下的只有小飞龙和兽王的鹰。</p></blockquote>
<p>下面是视频地址,希望你能喜欢 </p>
<p><embed src="http://player.youku.com/player.php/sid/XMTkxNDUwMjE2/v.swf" quality="high" width="450" height="380" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash"></embed><br />
<strong><a href="http://www.islandcn.com/post/795.html">dota 6.67C 最新bug</a>-小鸟带攻击力</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/795.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(八) - 类的继承</title>
		<link>http://www.islandcn.com/post/791.html</link>
		<comments>http://www.islandcn.com/post/791.html#comments</comments>
		<pubDate>Thu, 22 Jul 2010 01:35:45 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[教程]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[继承]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=791</guid>
		<description><![CDATA[同样的子类可以继承父类的属性和方法，而且还可以拥有自己的属性和方法。但是要注意一点，类的世界里面只有”父子关系“，毕竟类不是真实的动物]]></description>
			<content:encoded><![CDATA[<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，就不对多继承进行过多的讨论了。</p>
<div class="wp-caption alignnone" style="width: 447px"><img title="php面向对象-类的继承" src="../wp-content/uploads/2010/07/php-8-1.gif" alt="php面向对象-类的单继承" width="437" height="486" /><p class="wp-caption-text">php面向对象-类的单继承</p></div>
<div class="mceTemp">也不妨来看看多继承的图，顺便了解下吧：</div>
<div class="mceTemp">
<div class="wp-caption alignnone" style="width: 452px"><img title="php面向对象编程-类的多继承" src="../wp-content/uploads/2010/07/php-8-2.gif" alt="php面向对象编程-类的多继承" width="442" height="208" /><p class="wp-caption-text">php面向对象编程-类的多继承</p></div>
</div>
<p> </p>
<p>前面说了,我个人觉得多继承是不符合现实的逻辑的,就是上图所示的样子.但是多继承这个功能是十分有用的,所以PHP为我们引入了接口,接口可以解决多继承的问题,同时又符合了现实的逻辑.关于接口这个东东,我们会在后面的章节中讲解.</p>
<p>现在图看完了,那么打起精神来看代码吧,为了便于演示和便于大家理解,我把所有属性和方法都声明为了public,再次重声,我们不建议这么做:</p>
<pre name="code" class="php">
class Role //角色类
{
//属性部分
public $role_name; //名字

//方法部分
public function roleTalk() //说话
{
echo $this-&gt;role_name.&#039;：我会说话
&#039;;
}

public function roleFight() //发招
{
echo $this-&gt;role_name.&#039;：我会发招
&#039;;
}
}

class RoleSon extends Role //角色儿子类 继承 角色类
{
//方法部分
public function roleEat() //吃饭(儿子类自己的方法)
{
echo $this-&gt;role_name.&#039;：我会吃饭(儿子特有)
&#039;;
}
}

class RoleGrandson extends RoleSon //角色孙子类 继承 角色儿子类
{
//方法部分
public function roleShit() //拉屎(孙子类自己的方法)
{
echo $this-&gt;role_name.&#039;：我会拉屎(孙子特有)
&#039;;
}
}

//实例化角色类
$brother_chun = new Role();
$brother_chun-&gt;role_name = &#039;春哥&#039;;
$brother_chun-&gt;roleTalk();
$brother_chun-&gt;roleFight();

//实例化角色儿子类
$brother_chun_son = new RoleSon();
$brother_chun_son-&gt;role_name = &#039;春哥之子&#039;;
$brother_chun_son-&gt;roleTalk();
$brother_chun_son-&gt;roleFight();
$brother_chun_son-&gt;roleEat();

//实例化角色孙子类
$brother_chun_grandson = new RoleGrandson();
$brother_chun_grandson-&gt;role_name = &#039;春哥之孙&#039;;
$brother_chun_grandson-&gt;roleTalk();
$brother_chun_grandson-&gt;roleFight();
$brother_chun_grandson-&gt;roleEat();
$brother_chun_grandson-&gt;roleShit();
</pre>
<p>从上面的代码我们已经可以看出继承一个类的步骤非常简单，在子类的名称后面加上extends关键词，再跟上所要继承的父类的名称即可：</p>
<pre name="code" class="php">

class 子类的名称 extends 父类的名称
{
……
}
</pre>
<p>我们来看看示例代码的输出结果：</p>
<blockquote><p>春哥：我会说话<br />
春哥：我会发招<br />
春哥之子：我会说话<br />
春哥之子：我会发招<br />
春哥之子：我会吃饭(儿子特有)<br />
春哥之孙：我会说话<br />
春哥之孙：我会发招<br />
春哥之孙：我会吃饭(儿子特有)<br />
春哥之孙：我会拉屎(孙子特有)</p></blockquote>
<p>我们能发现子类不但可以继承父类的属性和方法,也可以拥有自己的属性和方法.如果我们尝试用&#8221;春哥&#8221;去访问子类的特有方法,那么程序就会报错.</p>
<p>&#8220;春哥之孙&#8221;虽然仅仅是继承了&#8221;春哥之子&#8221;,但是由于&#8221;春哥之子&#8221;继承了&#8221;春哥&#8221;,所以&#8221;春哥之孙&#8221;同时拥有它两个祖宗的属性和方法.</p>
<p>所以说继承这个东东是十分好用啊,你可以利用一个父类来派生出无数个功能更加强大或有特殊用途的子类来.比如把&#8221;人类&#8221;定义为一个父类,那么通过类的继承,按照性别就可以派生出&#8221;男人类&#8221;和&#8221;女人类&#8221;,按照人品就可以派生出&#8221;好人类&#8221;和&#8221;坏人类&#8221;,按照职业就可以派生出&#8221;工人类&#8221;和&#8221;农民类&#8221;……如此这般,他们同是人类,但又有各自的特点.</p>
<p>以上,什么代码重用易于维护之类老生常谈的好处我就不多说了,大家自己慢慢体会吧,今天就玩到这里.</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank"><span style="color: #319bd8;">http://www.im286.com/thread-4823948-1-1.html</span></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/791.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(七) - 类的特殊方法</title>
		<link>http://www.islandcn.com/post/778.html</link>
		<comments>http://www.islandcn.com/post/778.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 01:42:38 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[方法]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=778</guid>
		<description><![CDATA[这些特殊方法你也可以叫它们做特殊函数，因为我们前面说过了，方法就是类里面的函数。实际上前面我们已经玩过两个特殊方法了，还记得吗？就是构造方法和析构方法，即__construct和__destruct这两个方法。]]></description>
			<content:encoded><![CDATA[<p>这些<strong>特殊方法</strong>你也可以叫它们做<strong>特殊函数</strong>，因为我们前面说过了，方法就是类里面的函数。实际上前面我们已经玩过两个特殊方法了，还记得吗？就是<strong>构造方法</strong>和<strong>析构方法</strong>，即<strong>__construct</strong>和<strong>__destruct</strong>这两个方法。那么希望大家记住，PHP类里面凡是以<strong>双下划线开头</strong>的方法，都<strong>有特殊作用</strong>，并且都会<strong>自动执行</strong>。</p>
<p>今天我们就来玩<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>
<pre name="code" class="php">
class Role //角色类
{
    //属性部分
    private $role_name; //封装：角色的名字
    private $role_sex; //封装：角色的性别
    private $role_skill; //封装：角色的技能

    //方法部分
    private function __get($attribute_name) //允许访问属性(有一个参数：传入属性的名称)
    {
        if($attribute_name == &#039;role_name&#039; || $attribute_name == &#039;role_sex&#039;) //如果是：名字、性别
        {
            return $this-&gt;$attribute_name; //就允许访问
        }
    }
       
    private function __set($attribute_name,$attribute_value) //允许设置属性(有两个参数：传入属性的名称和值)
    {
        if($attribute_name == &#039;role_name&#039; || $attribute_name == &#039;role_sex&#039;) //如果是：名字、性别
        {
            $this-&gt;$attribute_name = $attribute_value; //就允许设置
        }
    }
}

//将角色类实例化得到一个对象
$brother_chun = new Role();

//设置属性
$brother_chun-&gt;role_name = &#039;春哥&#039;; //可以设置：姓名
$brother_chun-&gt;role_sex = &#039;男&#039;; //可以设置：性别
$brother_chun-&gt;role_skill = &#039;霸气菊花残&#039;; //无法设置：技能

//访问属性
echo $brother_chun-&gt;role_name.&#039;&lt;br /&gt;&#039;; //可以访问：姓名
echo $brother_chun-&gt;role_sex.&#039;&lt;br /&gt;&#039;; //可以访问：性别
echo $brother_chun-&gt;role_skill.&#039;&lt;br /&gt;&#039;; //无法访问：技能
</pre>
<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>
<pre name="code" class="php">
class Role //角色类
{
    //属性部分
    private $role_name; //封装：角色的名字
    private $role_sex; //封装：角色的性别
    private $role_skill; //封装：角色的技能

    //方法部分
    private function __get($attribute_name) //允许访问属性(有一个参数：传入属性的名称)
    {
        if($attribute_name == &#039;role_name&#039; || $attribute_name == &#039;role_sex&#039;) //如果是：名字、性别
        {
            return $this-&gt;$attribute_name; //就允许访问
        }
    }
       
    private function __set($attribute_name,$attribute_value) //允许设置属性(有两个参数：传入属性的名称和值)
    {
        if($attribute_name == &#039;role_name&#039; || $attribute_name == &#039;role_sex&#039;) //如果是：名字、性别
        {
            $this-&gt;$attribute_name = $attribute_value; //就允许设置
        }
    }
    //新增部分
    private function __isset($attribute_name) //检测属性是否设置(有一个参数：传入属性的名称)
    {
        return $this-&gt;$attribute_name; //返回结果
    }
       
    private function __unset($attribute_name) //删除属性(有一个参数：传入属性的名称)
    {
        unset($this-&gt;$attribute_name); //进行删除
    }
}

//将角色类实例化得到一个对象
$brother_chun = new Role();

//设置属性
$brother_chun-&gt;role_name = &#039;春哥&#039;; //可以设置：姓名
$brother_chun-&gt;role_sex = &#039;男&#039;; //可以设置：性别
$brother_chun-&gt;role_skill = &#039;霸气菊花残&#039;; //无法设置：技能

//访问属性
echo $brother_chun-&gt;role_name.&#039;&lt;br /&gt;&#039;; //可以访问：姓名
echo $brother_chun-&gt;role_sex.&#039;&lt;br /&gt;&#039;; //可以访问：性别
echo $brother_chun-&gt;role_skill.&#039;&lt;br /&gt;&#039;; //无法访问：技能

//新增部分
echo var_dump(isset($brother_chun-&gt;role_name)); //检测并输出变量是否被设置
unset($brother_chun-&gt;role_name); //删除此属性
echo $brother_chun-&gt;role_name.&#039;&lt;br /&gt;&#039;; //由于属性被删除，因此没有输出
</pre>
<p><strong>__isset()</strong>和<strong>__unset()</strong>这两个特殊方法的原理和__get()和set()方法的原理是一样的，即将属性作为参数传入，并在类的内部进行处理。说白了，这两个特殊方法就是为了方便在属性被封装的情况下，允许在类的外部使用isset()和unset()这两个PHP函数，更多的也没有什么好说的了，大家看代码和注释吧，尝试着修改运行看看，OK，今天就玩到这里。</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/778.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(六) - 类的封装</title>
		<link>http://www.islandcn.com/post/774.html</link>
		<comments>http://www.islandcn.com/post/774.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 01:36:29 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[封装]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=774</guid>
		<description><![CDATA[那么我们今天开始玩类的封装，什么是封装呢？额……就是封起来装(汗)， 其实大部分专业术语也很好从字面上的意思去理解，只不过绝大多数人一涉及到技术方面的问题，就习惯性的往高深的方向去想，]]></description>
			<content:encoded><![CDATA[<p>这里给大家一个小小的友情提示，由于论坛里的代码没有颜色提示，而代码里又含有大量详细的注释，虽然我已经仔细书写代码格式，但是在颜色相同的情况下，可能仍然不便于阅读。因此在代码太长导致大家眼花缭乱的时候，大家可以把代码复制下来，到有颜色提示的编辑器里阅读，比如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>
<pre name="code" class="php">
class 类的名称
{
    var $属性的名称; //没有访问修饰符，有var关键字

    function 方法的名称(参数列表) //没有访问修饰符
    {
        ……
    }
}
</pre>
<p>声明方式(建议使用)</p>
<pre name="code" class="php">
class 类的名称
{
    public $属性的名称; //有访问修饰符，var关键字被去掉了

    public function 方法的名称(参数列表) //有访问修饰符
    {
        ……
    }
}
</pre>
<p>注意：<strong>声明属性</strong>的时候，我们<strong>先要去掉var</strong>关键词，然后<strong>再前面加上访问修饰</strong>符public；<strong>声明方法</strong>的时候，<strong>直接在前面加上访问修饰符</strong>public即可。</p>
<p>我们来认识一下PHP类中的三个访问修饰符：</p>
<table class="t_table" style="width: 74.25%; height: 90px;" border="1" 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>
<pre name="code" class="php">
class Role //角色类
{
    //属性部分
    public $role_name; //角色的名字，请尝试将public换成protected或private进行封装

    //方法部分
    public function roleTalk() //角色说话，请尝试将public换成protected或private进行封装
    {
        echo &#039;我会说话&#039;;
    }
}

//实例化一个对象
$brother_chun = new Role();

//设置属性
$brother_chun-&gt;role_name = &#039;春哥&#039;;

//访问方法
$brother_chun-&gt;roleTalk();
</pre>
<p>上面这段代码将属性和方法声明为<strong>public</strong>时，程序运行<strong>正常</strong>；若尝试将属性或方法的访问修饰符换成<strong>protected</strong>和<strong>private</strong>，那么程序就会<strong>报错</strong>。因为私有的属性和方法是不允许从类的外部使用的。大家可以自己去亲自试验一下，体会一下，这样可以加深理解。那……今天就玩到这里吧。</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/774.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(五) - 类的构造方法和析构方法</title>
		<link>http://www.islandcn.com/post/772.html</link>
		<comments>http://www.islandcn.com/post/772.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 01:32:12 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[构造方法]]></category>

		<category><![CDATA[析构方法]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=772</guid>
		<description><![CDATA[所谓构造方法，就是在创建对象时自动执行的方法，也就是说，当你new一个对象的时候，不管你访不访问它，它都会自动执行。它是可以带参数的哦。构造方法通常用来执行一些初始化任务。]]></description>
			<content:encoded><![CDATA[<p>所谓<strong>构造方法</strong>，就是在<strong>创建对象时自动执行</strong>的方法，也就是说，当你new一个对象的时候，不管你访不访问它，它都会自动执行。它是可以<strong>带参数</strong>的哦。构造方法通常用来执行一些初始化任务。</p>
<p>构造方法的方法名称必须是 <strong>__construct</strong> ，注意前面是<strong>两个下划线</strong>，这是PHP5中的改进，在PHP4中，构造方法和其他语言一样，必须和类的名称相同，当然你要使用这种方式也可以，PHP5还是会认的，但是我不建议这么做，因为那样代码的可读性不强，而且万一某天你想修改类的名称时，你同时还得去修改构造方法的名称，因此我觉得PHP5这个小小的改进比其他语言显得更灵活些。</p>
<p>构造方法(建议使用)</p>
<pre name="code" class="php">
class Role //角色类
{
    function __construct(参数列表); //构造方法
    {
        ……
    }
}
</pre>
<p>构造方法(不建议使用)</p>
<pre name="code" class="php">
class Role //角色类
{
    function Role(参数列表); //构造方法
    {
        ……
    }
}
</pre>
<p>OK，我们来玩一下代码看看：</p>
<pre name="code" class="php">
class Role //角色类
{
    //属性部分
    var $role_name; //角色的名字
    var $role_sex; //角色的性别
    var $role_skill; //角色的技能

    //方法部分
    function __construct($name,$sex,$skill) //构造方法，自动执行
    {
       $this-&gt;role_name = $name; //将参数传进来，给“姓名”属性一个初始值
       $this-&gt;role_sex = $sex; //将参数传进来，给“性别”属性一个初始值
       $this-&gt;role_skill = $skill; //将参数传进来，给“技能”属性一个初始值

       echo $this-&gt;role_name.&#039;横空出世了&lt;br /&gt;&lt;br /&gt;&#039;; //如果这句话被输出，说明构造方法自动执行了
    }

    function roleTalk() //角色说话
    {
        echo $this-&gt;role_name.&#039;说：&#039;.&#039;我是一个&#039;.$this-&gt;role_sex.&#039;人&lt;br /&gt;&#039;; //输出：(角色的名字)说：我是一个(角色的性别)人
    }

    function roleFight() //角色发招
    {
        echo $this-&gt;role_name.&#039;使出了一招：&#039;.$this-&gt;role_skill.&#039;&lt;br /&gt;&lt;br /&gt;&#039;; //输出：(角色的名字)使出了一招(角色的技能)
    }
}

//实例化一个对象，同时将构造方法所需要的参数传入
$brother_chun = new Role(&#039;春哥&#039;,&#039;男&#039;,&#039;霸气菊花残&#039;);

//属性设置(因为我们我们已经在构造方法中给了属性初始值，所以不需要设置了)

//访问方法
$brother_chun-&gt;roleTalk();
$brother_chun-&gt;roleFight();
</pre>
<p>运行后我们可以得到以下结果：</p>
<blockquote><p>春哥横空出世了</p>
<p>春哥说：我是一个男人<br />
春哥使出了一招：霸气菊花残</p></blockquote>
<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>
<pre name="code" class="php">
class Role //角色类
{
    function __destruct(); //析构方法
    {
        ……
    }
}
</pre>
<p>那么结合前面的代码，我们把析构方法加进去，也来玩玩析构方法的代码吧：</p>
<pre name="code" class="php">
class Role //角色类
{
    //属性部分
    var $role_name; //角色的名字
    var $role_sex; //角色的性别
    var $role_skill; //角色的技能

    //方法部分
    function __construct($name,$sex,$skill) //构造方法，自动执行
    {
       $this-&gt;role_name = $name; //将参数传进来，给“姓名”属性一个初始值
       $this-&gt;role_sex = $sex; //将参数传进来，给“性别”属性一个初始值
       $this-&gt;role_skill = $skill; //将参数传进来，给“技能”属性一个初始值

       echo $this-&gt;role_name.&#039;横空出世了&lt;br /&gt;&lt;br /&gt;&#039;; //如果这句话被输出，说明构造方法自动执行了
    }

    function roleTalk() //角色说话
    {
        echo $this-&gt;role_name.&#039;说：&#039;.&#039;我是一个&#039;.$this-&gt;role_sex.&#039;人&lt;br /&gt;&#039;; //输出：(角色的名字)说：我是一个(角色的性别)人
    }

    function roleFight() //角色发招
    {
        echo $this-&gt;role_name.&#039;使出了一招：&#039;.$this-&gt;role_skill.&#039;&lt;br  /&gt;&lt;br /&gt;&#039;; //输出：(角色的名字)使出了一招(角色的技能)
    }

    function __destruct() //析构方法，自动执行
    {
         echo $this-&gt;role_name.&#039;打完收招，只见天上的浮云组成了一个“纯”字&#039;; //如果这句话被输出，说明析构方法自动执行了
    }
}

//实例化一个对象，同时将构造方法所需要的参数传入
$brother_chun = new Role(&#039;春哥&#039;,&#039;男&#039;,&#039;霸气菊花残&#039;);

//属性设置(因为我们我们已经在构造方法中给了属性初始值，所以不需要设置了)

//访问方法
$brother_chun-&gt;roleTalk();
$brother_chun-&gt;roleFight();
</pre>
<p>运行后我们可以得到以下结果：</p>
<blockquote><p>春哥横空出世了</p>
<p>春哥说：我是一个男人<br />
春哥使出了一招：霸气菊花残</p>
<p>春哥打完收招，只见天上的浮云组成了一个“纯”字</p></blockquote>
<p>好啦,构造函数和析构函数我们就玩到这里!</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/772.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(四) - 类的访问</title>
		<link>http://www.islandcn.com/post/770.html</link>
		<comments>http://www.islandcn.com/post/770.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 01:25:04 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[访问]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=770</guid>
		<description><![CDATA[在访问时，属性的名称是不带$号的，这一点，在《PHP 和 MySQL Web开发》(第三版)一书中的有些例子是错误的，虽然这本书被称为PHP的“圣经”，但是无论什么样书都难免出现人为的失误，所谓人非圣贤，孰能无过？所以俗话说尽信书不如无书，同样的提醒正在看我这篇教程的初学者们]]></description>
			<content:encoded><![CDATA[<p>好,今天我们要玩的东西比较多,所以要集中精力哦.我们已经通过将类实例化来创建了&#8221;春哥&#8221;、&#8221;曾哥&#8221;和&#8221;凤姐&#8221;,但是他们还不能说话、还不能发招,怎么办呢?这就需要我们通过访问类的内容来实现.所谓访问,也是个专业术语,为了方便大家记忆和理解,大家只需要记住:</p>
<p>我们要<strong>使用“春哥”的特性</strong>，实际上就是要<strong>访问“春哥”的属性</strong>；<br />
我们要<strong>使用“春哥”的行为</strong>，实际上就是要<strong>访问“春哥”的方法</strong>。</p>
<p>从类的<strong>内部</strong>访问属性和方法，我们要用<strong>this关键字</strong>。</p>
<p>访问属性：</p>
<pre name="code" class="php">
$this-&gt;属性的名称;
</pre>
<p>设置属性值(其实跟变量赋值是一个道理)：</p>
<pre name="code" class="php">
$this-&gt;属性的名称 = 属性的值;
</pre>
<p>访问方法：</p>
<pre name="code" class="php">
$this-&gt;方法的名称();
</pre>
<p>从类的<strong>外部</strong>访问属性和方法，我们要使用<strong>对象的名称</strong>。</p>
<p>访问属性：</p>
<pre name="code" class="php">
$对象的名称-&gt;属性的名称;
</pre>
<p>设置属性值(其实跟变量赋值是一个道理)：</p>
<pre name="code" class="php">
$对象的名称-&gt;属性的名称 = 属性的值;
</pre>
<p>访问方法：</p>
<pre name="code" class="php">
$对象的名称-&gt;方法的名称();
</pre>
<p>注意：在访问时，属性的名称是<strong>不带$号</strong>的，这一点，在《PHP 和 MySQL Web开发》(第三版)一书中的有些例子是错误的，虽然这本书被称为PHP的“圣经”，但是无论什么样书都难免出现人为的失误，所谓人非圣贤，孰能无过？所以俗话说<strong>尽信书不如无书</strong>，同样的提醒正在看我这篇教程的初学者们，<strong>尽信我不如无我</strong>，最重要的还是要大家自己去思考，培养独立思考的能力，不是吗？</p>
<p>光看上面的内容可能很难看出什么来，这很正常，没有关系，下面我们马上通过实例来说明它们的作用。</p>
<p>首先我们完善角色类，让它拥有一切比较实际的功能，这时，我们就要用到<strong>内部访问</strong>来修改它了：</p>
<pre name="code" class="php">
class Role //角色类
{
    //属性部分
    var $role_name; //角色的名字
    var $role_sex; //角色的性别
    var $role_skill; //角色的技能

    //方法部分
    function roleTalk() //角色说话
    {
        echo $this-&gt;role_name.&#039;说：&#039;.&#039;我是一个&#039;.$this-&gt;role_sex.&#039;人&lt;br /&gt;&#039;; //输出：(角色的名字)说：我是一个(角色的性别)人
    }

    function roleFight() //角色发招
    {
        echo $this-&gt;role_name.&#039;使出了一招：&#039;.$this-&gt;role_skill.&#039;&lt;br /&gt;&#039;; //输出：(角色的名字)使出了一招：(角色的技能)
    }
}
</pre>
<p>为了方便讲解，每个方法里我只用了一个echo作为它的功能。当然如果你有时间和精力的话，可以去做一些更为复杂强大的功能。</p>
<p>接下来，如果我们要让“春哥”这个对象“活”起来，那么就要用<strong>外部访问</strong>了：</p>
<pre name="code" class="php">
//别忘了要一定先new一个名称为brother_chun的对象哦
$brother_chun = new Role();

//设置属性
$brother_chun-&gt;role_name = &#039;春哥&#039;; //设置“春哥”的名字
$brother_chun-&gt;role_sex = &#039;男&#039;; //设置“春哥”的性别
$brother_chun-&gt;role_skill = &#039;霸气菊花残&#039;; //设置“春哥”的技能

//访问方法
$brother_chun-&gt;roleTalk(); //让“春哥”说话
$brother_chun-&gt;roleFight(); //让“春哥”发招
</pre>
<p>同理于“曾哥”和“凤姐”，为了方便大家查看，给出完整代码：</p>
<pre name="code" class="php">
class Role //角色类
{
    //属性部分
    var $role_name; //角色的名字
    var $role_sex; //角色的性别
    var $role_skill; //角色的技能

    //方法部分
    function roleTalk() //角色说话
    {
        echo $this-&gt;role_name.&#039;说：&#039;.&#039;我是一个&#039;.$this-&gt;role_sex.&#039;人&lt;br  /&gt;&#039;; //输出：(角色的名字)说：我是一个(角色的性别)人
    }

    function roleFight() //角色发招
    {
        echo $this-&gt;role_name.&#039;使出了一招：&#039;.$this-&gt;role_skill.&#039;&lt;br /&gt;&lt;br /&gt;&#039;; //输出：(角色的名字)使出了一招(角色的技能)
    }
}

//“春哥”横空出世
$brother_chun = new Role();
//设置属性
$brother_chun-&gt;role_name = &#039;春哥&#039;;
$brother_chun-&gt;role_sex = &#039;男&#039;;
$brother_chun-&gt;role_skill = &#039;霸气菊花残&#039;;
//访问方法
$brother_chun-&gt;roleTalk();
$brother_chun-&gt;roleFight();

//“曾哥”横空出世
$brother_zeng = new Role();
//设置属性
$brother_zeng -&gt;role_name = &#039;曾哥&#039;;
$brother_zeng -&gt;role_sex = &#039;男&#039;;
$brother_zeng -&gt;role_skill = &#039;爷们菊花劫&#039;;
//访问方法
$brother_zeng -&gt;roleTalk();
$brother_zeng -&gt;roleFight();

//“凤姐”横空出世
$sister_feng = new Role();
//设置属性
$sister_feng -&gt;role_name = &#039;凤姐&#039;;
$sister_feng -&gt;role_sex = &#039;女&#039;;
$sister_feng -&gt;role_skill = &#039;知音故事会&#039;;
//访问方法
$sister_feng -&gt;roleTalk();
$sister_feng -&gt;roleFight();
</pre>
<blockquote><p>春哥说：我是一个男人<br />
春哥使出了一招：霸气菊花残</p>
<p>曾哥说：我是一个男人<br />
曾哥使出了一招：绵阳菊花劫</p>
<p>凤姐说：我是一个女人<br />
凤姐使出了一招：知音故事会</p></blockquote>
<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>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/770.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(三) - 类的实例化</title>
		<link>http://www.islandcn.com/post/768.html</link>
		<comments>http://www.islandcn.com/post/768.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 01:17:20 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[实例化]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=768</guid>
		<description><![CDATA[所谓实例化，就是前面我们提到的具体化，只不过实例化这个术语更专业一些，多认识些专业术语没有坏处，说起这个专业术语啊，这个……啊！这个这个……啊！我经常看到一些人，本来很简单的事情，被他们一口一个专业术语]]></description>
			<content:encoded><![CDATA[<p>所谓<strong>实例化</strong>，就是前面我们提到的<strong>具体化</strong>，只不过实例化这个术语更专业一些，多认识些专业术语没有坏处，说起这个专业术语啊，这个……啊！这个这个……啊！我经常看到一些人，本来很简单的事情，被他们一口一个专业术语，把人家外行人(大部分是客户)忽悠得晕头转向，结果被忽悠的人还在那边一脸一个羡慕……我们不提倡忽悠人，但是我们得建立自己的防忽悠热线，所以多认识一些专业术语还是非常有必要的。</p>
<p>扯远了，我们把<strong>类实例化以后就可以得到对象</strong>了，将类实例化的方法：</p>
<pre name="code" class="php">
$对象名称 = new 类的名称();
</pre>
<p>结合前面的代码，我们要<strong>创建一个“春哥”</strong>，实际上就是要<strong>实例化一个名称为“春哥”的对象</strong>，代码如下：</p>
<pre name="code" class="php">
$brother_chun = new Role();
</pre>
<p>到这里可能要有人感叹了，这PHP的OOP咋越玩越简单呢？没错，后面会越来越简单。为了方便大家查看，给出完整的代码如下：</p>
<pre name="code" class="php">

class Role //角色类
{
    //属性部分
    var $role_name; //角色的名字
    var $role_sex; //角色的性别
    var $role_skill; //角色的技能

    //方法部分
    function roleTalk() //角色说话
    {
        echo &#039;我会说话&lt;br /&gt;&#039;;
    }

    function roleFight() //角色发招
    {
        echo &#039;我会发招&lt;br /&gt;&#039;;
    }
}

//将角色类实例化
$brother_chun = new Role(); //创建一个名称为“春哥”的对象
$brother_zeng = new Role(); //创建一个名称为“曾哥”的对象
$sister_feng = new Role(); //创建一个名称为“凤姐”的对象
</pre>
<p>当然我们还可以创建无数个其他人，虽然代码比较少，但是类的第一个好处<strong>代码重用</strong>已经显而易见了，我们可以通过一个类来创建无数个对象，设想如果一个类里面有成百上千行代码的话，我们可以节省多少行代码啊？</p>
<p>再设想，我们已经在游戏里创建了100个人，突然某天我们想要修改他们，如果不使用类创建的话，那么我们可能就要修改100个地方，而我们使用了类之后，仅仅只需要修改1个地方——修改我们的类即可，于是类的第二个好处<strong>易于维护</strong>也显而易见了，我们可以节省多少精力啊？</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/768.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(二) - 类的创建</title>
		<link>http://www.islandcn.com/post/766.html</link>
		<comments>http://www.islandcn.com/post/766.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 01:13:00 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[创建]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=766</guid>
		<description><![CDATA[PHP的类里面大概包含两个部分,即它的成员属性和成员方法,不要紧张,我们不去挖它们的概念,所谓属性和方法,就是类里面的成员变量和成员函数.所以从现在开始]]></description>
			<content:encoded><![CDATA[<blockquote><p>前面我已经表示得很清楚了,PHP是一种混合型语言,这也是它的优势,因此,我们可以拿起锯子就做一把椅子(面向过程),也可以经过周密的计划来建造一栋房子(面向对象),无论是面向对象还是面向过程,都有自己的优势,都要付出一定的代价.但是,我们还是要会玩面向对象才行啊,因为从某种意义上来讲,面向过程已经是一种过于&#8221;传统&#8221;的编程思想,毕竟面向对象更符合现实的逻辑.</p>
<p>从PHP5开始,PHP已经完全支持面向对象,PHP6势必要加强对面向对象的支持.那么PHP官方为什么越来越重视面向对象呢?答案是不言而喻的.起初,PHP只是为个人和小项目而设计的脚本语言,但是现在不一样了,作为最优秀、最流行的客户端脚本语言之一,PHP的地位已经被越来越多的人认可,现今为止它在无数大型项目上的表现也令人感到十分满意,已经证明了它足以胜任任何大型项目.由于它是跨平台、免费的,因此被越来越多的人喜爱和接纳,尤其是JAVA阵营的朋友们.</p>
<p>我们不妨来展望一下PHP的未来,通过AMFPHP,PHP与Flex、Flash、Json、XML等技术实现了二进制无缝通信.ActionScript3.0开始,也开始完全支持面向对象,再加上Flex和Flash助阵,我们不仅可以利用PHP来开发WEB应用程序、RIA应用程序、而且还可以开发移动应用程序(Flash逐渐开始在移动平台崭露头角,目前已经得到Android 2.2的支持,注意是真真正正的Flash,而非面向低端手机的Flash Lite,而这一切仅仅是一个开端),这对我国马上就要到来3G时代有着非凡的意义.</p>
<p>因此,对于一个真正的PHPer来说,如果不接触面向对象,那的确是一种遗憾.</p></blockquote>
<p> </p>
<p>好,那么从今天开始,我们就要玩代码了,PHP的类里面大概包含两个部分,即它的成员属性和成员方法,不要紧张,我们不去挖它们的概念,所谓属性和方法,就是类里面的成员变量和成员函数.所以从现在开始,只要我提到属性,大家就要下意识的想到它是一个变量;只要我提到方法大家就要下意识的想到,它是一个函数.因此,我在这里给出一个狭义的结论,请大家牢记:</p>
<p><strong>属性</strong>就是<strong>变量</strong><br />
<strong>方法</strong>就是<strong>函数</strong></p>
<p>当然对外大家不能这么说,因为他们性质是截然不同的,由于我们回避了概念性的东西,这么说仅仅是为了便于大家记忆和理解.</p>
<p>好,那么我们现在来玩一玩怎么创建一个完整的PHP类.这里可能会涉及到一些命名规范,关于这些规范,大家可以参阅我另外一篇文字《分享下我编程的代码规范》</p>
<p><a href="http://www.im286.com/thread-4111157-1-1.html">http://www.im286.com/thread-4111157-1-1.html</a></p>
<p>创建类的方法:</p>
<pre name="code" class="php">

class 类的名称
{
var $属性的名称;

function 方法的名称(参数列表)
{
……
}
}
</pre>
<p>这样就是一个完整的类，怎么样？够简单吧？它本来也就不难，只是很多人由于一些概念性问题不原意接去触它，但是一旦接触了，大家会发现，它也就不过如此嘛，的确，它也就不过如此。</p>
<p>一个类里面可以包含<strong>多个属性</strong>和<strong>多个方法</strong>。</p>
<p>那么我们结合前面假设开发的游戏来设计一个类：</p>
<pre name="code" class="php">

class Role //角色类
{
    //属性部分
    var $role_name; //角色的名字
    var $role_sex; //角色的性别
    var $role_skill; //角色的技能

    //方法部分
    function roleTalk() //角色说话
    {
        echo &#039;我会说话&lt;br /&gt;&#039;;
    }

    function roleFight() //角色发招
    {
        echo &#039;我会发招&lt;br /&gt;&#039;;
    }
}
</pre>
<p>这样,一个具有完整属性和方法的类就算是建好了,是不是简单得掉渣呢?至于我们如何利用这个类来创造出&#8221;春哥&#8221;、&#8221;曾哥&#8221;和&#8221;凤姐&#8221;,并且让他们都会说话,都能发招呢?请看下玩分解.</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/766.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程(一) - 类和对象的关系</title>
		<link>http://www.islandcn.com/post/764.html</link>
		<comments>http://www.islandcn.com/post/764.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 01:08:47 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[对象]]></category>

		<category><![CDATA[类]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=764</guid>
		<description><![CDATA[首先声明OOP的概念是很重要的,因为它是OOP编程思想的基础,我在本教程里刻意的回避概念性问题,是为了降低初学者的恐惧心、增加初学者的求知欲,前面说了,很多不原意接触OOP的PHPer就是被概念折腾的.所以,大家千万不要跟人家说]]></description>
			<content:encoded><![CDATA[<p>假设我们要用PHP开发一个游戏……<br />
&#8220;PHP能开发游戏吗?&#8221;<br />
&#8220;不能吗?&#8221;<br />
&#8220;你开发一个给我看看!&#8221;<br />
&#8220;你给我钱嘛!&#8221;<br />
&#8220;滚!&#8221;<br />
(orz 不要再废话了,抓紧时间进入正题)</p>
<p>好了,这个无聊的争论就不要继续了,我总不能拿按钮、文本域、表格这些东东当作对象给初学者们讲述OOP吧?那样大家会崩溃的,我也会崩溃的.为了增加本教程的易懂性、通俗性和趣味性……我决定了就假设我们要用PHP开发一个游戏,都说了,要玩嘛.</p>
<p>首先声明OOP的概念是很重要的,因为它是OOP编程思想的基础,我在本教程里刻意的回避概念性问题,是为了降低初学者的恐惧心、增加初学者的求知欲,前面说了,很多不原意接触OOP的PHPer就是被概念折腾的.所以,大家千万不要跟人家说,啊,那个谁?Hetty说了,OOP概念算个屁,不用去管.OMG……那我岂不是成了罪人?</p>
<p>本教程旨在先玩会OOP,再去了解OOP的概念.如果你没有玩过星际争霸和魔兽争霸的话,突然蹦出一个人就跟你大谈游戏平衡性的概念,就算他一套一套的跟你讲得头头是道,你势必也将是一头雾水,但如果是你玩过这两款游戏的话,根本不需要谁跟你讲,就算游戏平衡性的概念再飘逸,你自己也能在玩的过程中感觉到、体会到的.OOP也是一样,你自己悟出来的要比别人言传身教的清晰牢固千百倍,这就是本教程的出发点.</p>
<p>至于吗?强调这么多遍……好吧,你赢了,先看图,在这个游戏里,我们将设计三个角色:</p>
<div class="wp-caption alignnone" style="width: 476px"><img title="php面向对象编程教学-类和对象的关系" src="../wp-content/uploads/2010/07/php-1.gif" alt="php面向对象编程教学-类和对象的关系" width="466" height="382" /><p class="wp-caption-text">php面向对象编程教学-类和对象的关系</p></div>
<p>(就这水平了,将就着看吧)</p>
<p>红色是类,蓝色是对象.很多初学者经常把类和对象混淆,如果你是这类人,那么就多看一段时间,把这个图印在你心里,反复揣摩.如果你连思考都不愿意的话,那么就不必再往下看了,因为那是在浪费时间.</p>
<p>看好了吗?什么?一分钟都不到,回去继续看,是男人就持久点.</p>
<p>看出什么端倪了吗?我们可以看到红色的&#8221;角色&#8221;是空心的,因为它不是一个实体,只是个虚无缥渺的词汇,我们看不见摸不着,但是它却存在于我们心里;而蓝色&#8221;春哥&#8221;、&#8221;曾哥&#8221;和&#8221;凤姐&#8221;是实心的,因为它们是实体,是三个真真切切的人,我们看得见摸得着(如果敢摸的话),存在于我们的生活中.</p>
<p>在这个游戏中,你可以说&#8221;春哥&#8221;是一个&#8221;角色&#8221;,但绝对不能倒过来说&#8221;角色&#8221;是一个&#8221;春哥&#8221;,就像你不能说&#8221;水果&#8221;是一种&#8221;苹果&#8221;一样,不止是逻辑上说不过去,就连语法上也说不过去,这个……只需要小学语文水平就可以理解.</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>这时有人就会问了,生活中的类我们很熟悉,很好区分啊,那么程序中的类该怎么区分呢?其实道理是一样的,我们把有相同特征的东东归为一类就可以了.比如&#8221;大黄蜂&#8221;、&#8221;擎天柱&#8221;、&#8221;铁皮&#8221;,他们有相同的特性(属性):有高度、有重量、有颜色;他们有相同的行为(方法):会变形、会说话、会走路.因此,在程序中,我们经常把具有相同属性和方法的对象归为一类.</p>
<p>每个对象都是唯一的,就算你有两个一模一样的&#8221;大黄蜂&#8221;,但是每个&#8221;大黄蜂&#8221;都是独立存在的个体,就像同名同姓的人很多,但是&#8221;春哥&#8221;却是这个世界上独一无二的(多了这个世界会灭亡的).</p>
<p><strong>程序与生活不同的地方:</strong></p>
<p>在生活中,往往是把一组对象归为一类:先有了很多苹果的果实,我们才能把它们归为苹果类.<br />
在程序中,往往是用类来产生一组对象:先有了角色类,我们才能创造出春哥、曾哥和凤姐来.</p>
<p>好了,今天就玩到这里,表达能力有限,不知道大家看明白没有?如果没有看明白的话,争取看明白,因为这篇看明白了,后面就将一马平川,越来越好玩.</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/764.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php面向对象OOP编程教程</title>
		<link>http://www.islandcn.com/post/758.html</link>
		<comments>http://www.islandcn.com/post/758.html#comments</comments>
		<pubDate>Thu, 15 Jul 2010 00:54:15 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[php]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[教程]]></category>

		<category><![CDATA[编程]]></category>

		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=758</guid>
		<description><![CDATA[这是一篇有悖常理的、大胆的教程,因为我要在不涉及或尽少涉及OOP概念的前提下,向读者介绍PHP的OOP.绝大部分PHPer对OOP敬而远之、退避三舍,就是被OOP那抽象繁琐、把人弄得焦头烂额的概念吓跑的,所以,本教程有意识的避开了OOP概念的讲解,力求通过实例用最简单、最通俗的方式来表述PHP的OOP.]]></description>
			<content:encoded><![CDATA[<p>好久没有来落伍了,既然来了就做点微薄的贡献吧.既然是教程,为什么说&#8221;玩&#8221;而不说&#8221;学&#8221;呢?问得好,因为说&#8221;学&#8221;的话,别人一看见标题基本就躲得远远的,根本懒得去点,说&#8221;玩&#8221;的话,估计还有那么一两个人来点,哈哈,好吧,我承认我是标题党,你赢了.</p>
<p>还是那句老话:我的个人能力有限,教程如果有什么疏漏和不足的地方,望大家多多见谅,也欢迎大家批评指正.</p>
<p>［目标读者］<br />
本教程假设读者已经有了一定的PHP编程基础和经验,但还未开始接触PHP面向对象编程(以下简称OOP).因此,如果你是小鸟或者大鸟,都可以选择直接路过了.</p>
<p>［教程宗旨］<br />
这是一篇有悖常理的、大胆的教程,因为我要在不涉及或尽少涉及OOP概念的前提下,向读者介绍PHP的OOP.绝大部分PHPer对OOP敬而远之、退避三舍,就是被OOP那抽象繁琐、把人弄得焦头烂额的概念吓跑的,所以,本教程有意识的避开了OOP概念的讲解,力求通过实例用最简单、最通俗的方式来表述PHP的OOP.</p>
<p>［教程目录］<br />
第1课——————<a title="类和对象的关系" href="http://www.islandcn.com/post/764.html" target="_blank">类和对象的关系</a><br />
第2课——————<a title="类的创建" href="http://www.islandcn.com/post/766.html" target="_blank">类的创建</a><br />
第3课——————<a title="类的实例化" href="http://www.islandcn.com/post/768.html" target="_blank">类的实例化</a><br />
第4课——————<a title="类的访问" href="http://www.islandcn.com/post/770.html" target="_blank">类的访问</a><br />
第5课——————<a title="类的构造方法和析构方法" href="http://www.islandcn.com/post/772.html" target="_blank">类的构造方法和析构方法</a><br />
第6课——————<a title="类的封装" href="http://www.islandcn.com/post/774.html" target="_blank">类的封装</a><br />
第7课——————<a title="类的特殊方法" href="http://www.islandcn.com/post/778.html" target="_blank">类的特殊方法</a><br />
第8课——————<a title="类的继承" href="http://www.islandcn.com/post/791.html" target="_blank">类的继承</a><br />
第9课——————<a title="PHP类的重载" href="http://www.islandcn.com/post/820.html" target="_blank">类的重载</a><br />
第10课—————类的关键字(待续)</p>
<p>………………<br />
(边写边补充吧)</p>
<p>由于时间的关系,我可能无法保证本教程有一个正常规律的更新速度,在此希望大家能够见谅,没有耐心的朋友可以等到教程连载完毕再看.</p>
<p>首先是关于PHP的,PHP在很多大型项目中被运用,比如大家熟知的:</p>
<p>百度:http://www.baidu.com/index.php<br />
淘宝:http://www.taobao.com/index.php</p>
<p>等等,由于篇幅关系,我就不多举例了.PHP在国内外大型项目中的运用是屡见不鲜的,它被证明强大是经受了无数实战考验的,每个人都有权质疑它的强大,但是在此之前,我们需要先抱着谦卑的态度去了解它.</p>
<p>这里融入一些个人感情,注意是个人的,我最喜欢、用得最多的服务端脚本语言就是PHP,也认为它是所有服务端脚本语言中最优秀的.</p>
<p>其次是关于PHP的OOP,这是仁者见仁智者见智的事情,PHP是混合型语言,这也可以看作是它的优势之一.</p>
<p>我们可以拿起锯子就做一把椅子,但是不经过计划拿起锯子就来建造一栋房子,房子的质量就没有保证了.</p>
<p>那么有位回帖的朋友就刚好说反了,OOP其实可以让PHP的代码更加简洁易懂,除此之外,更加易于维护,并且具有更强的重用性.</p>
<p>然后是关于PHP的基础,请参看我2006年发的一篇教程《30分钟学会用PHP写带数据库的简单通讯录》</p>
<p>http://www.im286.com/thread-1738385-1-1.html</p>
<p>下面开始写正题.</p>
<p>作者:<strong>hetty</strong> 首发地址:<a href="http://www.im286.com/thread-4823948-1-1.html" target="_blank">http://www.im286.com/thread-4823948-1-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/758.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Magento 使用总结的一些细节记录</title>
		<link>http://www.islandcn.com/post/754.html</link>
		<comments>http://www.islandcn.com/post/754.html#comments</comments>
		<pubDate>Mon, 21 Jun 2010 05:51:22 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Web]]></category>

		<category><![CDATA[Magento]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[开源]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=754</guid>
		<description><![CDATA[magento 的确很强悍,对于初学者来说 建议还是先了解下这个系统的运行机制

对于未接触过国外开源的解决方案的朋友来说已经习惯于拿到东西就找templates/skins目录,找html的模板文件,然后看标签,打开后台修改等等...而国外的开源并非这么简单.
]]></description>
			<content:encoded><![CDATA[<p>magento是国外一款优秀的PHP+MYSQL开源B2C电子商务解决方案,的确很强悍,我以前曾用过Zen-cart,相对来说Magento比较难入门一些,<a href="http://www.magentocommerce.com/" target="_blank">magento</a> 的确很强悍,对于初学者来说 建议还是先了解下这个系统的运行机制</p>
<p>对于未接触过国外开源的解决方案的朋友来说已经习惯于拿到东西就找templates/skins目录,找html的模板文件,然后看标签,打开后台修改等等&#8230;而国外的开源并非这么简单.</p>
<p>前几天我用的是magento 1.4.0.1,据说这个版本跟上个版本默认的模板结构发生了一些变化,现有模板结构是(只列出部分常用文件结构,详细结构可以用google或者官方上看下,全部列出来反而让人觉得繁琐,不易理解):</p>
<p><strong>app/design/frontend/base/default/tempate/</strong></p>
<p>据说这个目录以前是在app/design/frontend/default下面的,后来因为magento的使用者乱改default的模板影响使用,所以官方为了避免使用者乱改默认模板,为了突出其重要性,在1.4.0.1以后移至此目录中了..</p>
<p>在目录 <strong>app/design/frontend/base/default/tempate/</strong> 中</p>
<p>有layout目录 是存储页面布局数据的</p>
<p>重要的是template目录,存储了网站的模板文件,在此目录中打开 page/html文件夹你会看到网站主要的模板文件,注意:模板文件的后缀都是.phtml</p>
<p>另外 模板的样式.css文件/图片文件都在</p>
<p>skin\frontend\default对应的目录中</p>
<p>app/design/frontend/base/default/tempate/</p>
<p>假设我们要修改logo,打开\app\design\frontend\base\default\template\page\html\header.phtml文件,代码</p>
<pre name="code" class="php">

&lt;h1 class=&quot;logo&quot;&gt;&lt;strong&gt;&lt;?php echo $this-&gt;getLogoAlt() ?&gt;&lt;/strong&gt;&lt;a href=&quot;&lt;?php echo $this-&gt;getUrl(&#039;&#039;) ?&gt;&quot; title=&quot;&lt;?php echo $this-&gt;getLogoAlt() ?&gt;&quot; class=&quot;logo&quot;&gt;&lt;img src=&quot;&lt;?php echo $this-&gt;getLogoSrc() ?&gt;&quot; alt=&quot;&lt;?php echo $this-&gt;getLogoAlt() ?&gt;&quot; /&gt;&lt;/a&gt;&lt;/h1&gt;
</pre>
<p>代码中我们可以看到 &#8220;$this->getLogoSrc() &#8221; 而不是传统模板里面的源地址,而这个getlogosrc数据存储在哪里呢? 继续打开</p>
<p>app\code\core\Mage\Page\etc\config.xml ,节点logo_src中我们看到</p>
<pre name="code" class="xml">

 &lt;logo_src&gt;images/logo.gif&lt;/logo_src&gt;
</pre>
<p> 相信到这里大家对magento的模板机制有了个基础的认识了吧.</p>
<p>到这里你可能也许觉得,我kao  我每次改个东西还要到xml文件里改呀? 当然,那是不可能的,xml存储配置数据而已,所有数据的操作在后台就可以了:<br />
打开后台 System - Configuration - Design - Header </p>
<p>在这里你也同样可以修改.</p>
<p>另外注意个地方,关于很多人出现的首页不显示产品的问题.其实很多网上都是有了,譬如产品分类的IsActive属性,产品的库存量,Status等等</p>
<p>有个自己遇到的重点问题提醒下,就是关于默认分类的选择,Magento默认有个分类,如果你当前添加的分类全部隶属于这个分类,那么才会显示在首页,即首页的分类导航位置以及最新的产品.</p>
<p>当然如果你也可以自己再添加一个Root Category,然后再该分类下添加产品分类及产品,如果这样的话需要进行设置默认的Root Category: System - Manage Stores - Main Website Store - Root Category  在下拉框中选中你刚刚添加的那一个Root Category的名字即可.</p>
<p><a href="http://www.magentocommerce.com/download" target="_blank">Magento 最新版下载!!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/754.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>将Google设置为不会被重置的安全链接的方法</title>
		<link>http://www.islandcn.com/post/750.html</link>
		<comments>http://www.islandcn.com/post/750.html#comments</comments>
		<pubDate>Sat, 12 Jun 2010 01:06:08 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[IT]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[搜索]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=750</guid>
		<description><![CDATA[在用google的时候无缘无故被断开,就是打不开google的症状.  大概几分钟后才会正常使用.现在针对这种症状下面介绍下解决方法.
]]></description>
			<content:encoded><![CDATA[<p>在用google的时候无缘无故被断开,就是打不开google的症状.  大概几分钟后才会正常使用.现在针对这种症状下面介绍下解决方法.<br />
将Google设置为不会被重置的安全链接的方法<br />
地址栏内输入 <a href="http://www.google.com/ncr/" target="_blank">google.com/ncr</a> ，自动重定向至无地区差异的Google英文主页（若此时仍被重置可以稍等几分钟再试）；<br />
在链接被重定向至英文的 <a href="http://www.google.com" target="_blank">www.google.com</a> 后，在地址栏内输入 https://www.google.com 便可生效；<br />
以后每次都使用 <a href="https://www.google.com" target="_blank">https 开头的google地址</a>即可保证正常搜索!</p>
<p>FUCK THE GFW!!!!!!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/750.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>VB.NET完美操作XML实例,操作XML类</title>
		<link>http://www.islandcn.com/post/746.html</link>
		<comments>http://www.islandcn.com/post/746.html#comments</comments>
		<pubDate>Thu, 06 May 2010 05:42:13 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Software]]></category>

		<category><![CDATA[VB.NET]]></category>

		<category><![CDATA[XML]]></category>

		<category><![CDATA[类]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=746</guid>
		<description><![CDATA[大概分为两种
一种是单数据存储,这类应用就是 保存配置之类的,所有节点元素 都是单一的,首先先看一个操作XML中的元素值的类


Public Class CSysXML
    Dim mXmlDoc As New System.Xml.XmlDocument
    Public XmlFile As String

    Public Sub New(ByVal File As String)
        MyClass.XmlFile = File
        MyClass.mXmlDoc.Load(MyClass.XmlFile)       &#039;加载配置文件
  [...]]]></description>
			<content:encoded><![CDATA[<p>大概分为两种<br />
一种是单数据存储,这类应用就是 保存配置之类的,所有节点元素 都是单一的,首先先看一个操作XML中的元素值的类</p>
<pre name="code" class="vb">

Public Class CSysXML
    Dim mXmlDoc As New System.Xml.XmlDocument
    Public XmlFile As String

    Public Sub New(ByVal File As String)
        MyClass.XmlFile = File
        MyClass.mXmlDoc.Load(MyClass.XmlFile)       &#039;加载配置文件
    End Sub

    &#039;功能：取得元素值
    &#039;参数：node--节点       element--元素名
    &#039;返回：元素值   字符型
    &#039;             $--表示出错误
    Public Function GetElement(ByVal node As String, ByVal element As String) As String
        On Error GoTo Err
        Dim mXmlNode As System.Xml.XmlNode = mXmlDoc.SelectSingleNode(&quot;//&quot; + node)

        &#039;读数据
        Dim xmlNode As System.Xml.XmlNode = mXmlNode.SelectSingleNode(element)
        Return xmlNode.InnerText.ToString
Err:
        Return &quot;$&quot;
    End Function
    &#039;
    &#039;功能：保存元素值
    &#039;参数：node--节点名称     element--元素名       val--值
    &#039;返回：True--保存成功     False--保存失败
    Public Function SaveElement(ByVal node As String, ByVal element As String, ByVal val As String) As Boolean
        On Error GoTo err
        Dim mXmlNode As System.Xml.XmlNode = mXmlDoc.SelectSingleNode(&quot;//&quot; + node)
        Dim xmlNodeNew As System.Xml.XmlNode

        xmlNodeNew = mXmlNode.SelectSingleNode(element)
        xmlNodeNew.InnerText = val
        mXmlDoc.Save(MyClass.XmlFile)
        Return True
err:
        Return False
    End Function

End Class
</pre>
<p>此类模块的功能是修改某个节点元素的值<br />
我们保存下面代码为 shop.xml</p>
<pre name="code" class="xml">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt;
&lt;shop&gt;
  &lt;goods&gt;
    &lt;name&gt;11111&lt;/name&gt;
  &lt;/goods&gt;
&lt;/shop&gt;
</pre>
<p>打开VB.NET 在窗体上画三个文本框以及一个按钮<br />
实现操作XML的VB.NET,写入某节点的某元素的值的代码:</p>
<pre name="code" class="vb">

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim xmlTest As New CSysXML(Application.StartupPath &amp;amp;amp; &quot;\test.xml&quot;)
        xmlTest.SaveElement(TextBox1.Text, TextBox2.Text, TextBox3.Text)
    End Sub
</pre>
<p>TextBox1.Text 为节点的名称,写入 goods     &#8211;商品<br />
TextBox2.Text 为元素的名称,写入 name      &#8211;商品名称<br />
TextBox3.Text 为元素的值,任意写入一个值  &#8211;值</p>
<p>同理,读取xml文件也一样,用GetElement获取某节点元素的值.<br />
下面重点说下 多条记录的情况下</p>
<pre name="code" class="xml">

&lt;?xml version=&quot;1.0&quot; encoding=&quot;gb2312&quot;?&gt;
&lt;website&gt;
  &lt;web name=&quot;搜狐&quot;&gt;
    &lt;title&gt;搜狐-中国最大的门户&lt;/title&gt;
    &lt;url&gt;http://www.sohu.com&lt;/url&gt;
  &lt;/web&gt;
  &lt;web name=&quot;新浪&quot;&gt;
    &lt;title&gt;新浪-中国最好的门户&lt;/title&gt;
    &lt;url&gt;http://www.sina.com&lt;/url&gt;
  &lt;/web&gt;
&lt;/website&gt;
</pre>
<p>所需控件listbox1 列举所有name<br />
textbox 三个分别为 textbox4/textbox5/textbox6 ,分别用来保存/修改 name属性 title和url的值</p>
<p>按钮 四个分别用来增加/删除/修改/刷新</p>
<p>下面为全部代码</p>
<pre name="code" class="vb">

    &#039;add
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim xmlDoc As New XmlDataDocument
        xmlDoc.Load(&quot;111.xml&quot;)
        Dim root As XmlNode = xmlDoc.SelectSingleNode(&quot;collect&quot;)   &#039;find collect
        Dim xe1 As XmlElement = xmlDoc.CreateElement(&quot;rule&quot;)  &#039;create

        xe1.SetAttribute(&quot;name&quot;, TextBox6.Text) &#039;设置该节点name属性 

        Dim xe1Title As XmlElement = xmlDoc.CreateElement(&quot;title&quot;)   &#039;create title
        xe1Title.InnerText = TextBox4.Text
        xe1.AppendChild(xe1Title)

        Dim xe1Url As XmlElement = xmlDoc.CreateElement(&quot;url&quot;)    &#039;create url
        xe1Url.InnerText = TextBox5.Text
        xe1.AppendChild(xe1Url)

        root.AppendChild(xe1)   &#039;add to &lt;collect&gt;
        xmlDoc.Save(&quot;111.xml&quot;)

        Button3_Click(Nothing, Nothing)     &#039;refrest
    End Sub

    &#039;read
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        ListBox1.Items.Clear()
        Dim xmlDoc As New XmlDataDocument
        xmlDoc.Load(&quot;111.xml&quot;)
        Dim xn As XmlNode = xmlDoc.SelectSingleNode(&quot;collect&quot;)
        Dim xnl As XmlNodeList = xn.ChildNodes
        Dim xnf As XmlNode
        For Each xnf In xnl
            Dim xe As XmlElement = CType(xnf, XmlElement)
            If xe.GetAttribute(&quot;name&quot;) &lt;&gt; &quot;&quot; Then
                ListBox1.Items.Add(xe.GetAttribute(&quot;name&quot;)) &#039;&amp;amp; vbCrLf  &#039;显示属性值
            End If
        Next xnf
    End Sub

    &#039;delete
    Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
        If ListBox1.SelectedItems.Count = 0 Then Exit Sub
        Dim xmlDoc As New XmlDataDocument
        xmlDoc.Load(&quot;111.xml&quot;)
        Dim xnl As XmlNodeList = xmlDoc.SelectSingleNode(&quot;collect&quot;).ChildNodes
        Dim xn As XmlNode
        For Each xn In xnl
            Dim xe As XmlElement = CType(xn, XmlElement)
            If xe.GetAttribute(&quot;name&quot;) = ListBox1.SelectedItem.ToString Then
                xe.RemoveAttribute(&quot;name&quot;) &#039;删除genre属性
                xe.RemoveAll() &#039;删除该节点的全部内容
            End If
        Next xn
        xmlDoc.Save(&quot;111.xml&quot;)
        ListBox1.Items.Clear()
        Button3_Click(Nothing, Nothing)     &#039;refrest
    End Sub

    &#039;edit
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
        If ListBox1.SelectedItems.Count = 0 Then Exit Sub
        Dim xmlDoc As New XmlDataDocument
        xmlDoc.Load(&quot;111.xml&quot;)
        Dim nodeList As XmlNodeList = xmlDoc.SelectSingleNode(&quot;collect&quot;).ChildNodes &#039;获取bookstore节点的所有子节点
        Dim xn As XmlNode
        For Each xn In nodeList &#039;遍历所有子节点
            Dim xe As XmlElement = CType(xn, XmlElement) &#039;将子节点类型转换为XmlElement类型
            If xe.GetAttribute(&quot;name&quot;) = ListBox1.SelectedItem.ToString Then &#039;如果genre属性值为“李赞红”
                xe.SetAttribute(&quot;name&quot;, TextBox6.Text) &#039;则修改该属性为“update李赞红”
                Dim nls As XmlNodeList = xe.ChildNodes &#039;继续获取xe子节点的所有子节点
                Dim xn1 As XmlNode
                For Each xn1 In nls &#039;遍历
                    Dim xe2 As XmlElement = CType(xn1, XmlElement) &#039;转换类型
                    If xe2.Name = &quot;title&quot; Then &#039;如果找到
                        xe2.InnerText = TextBox4.Text  &#039;则修改
                    ElseIf xe2.Name = &quot;url&quot; Then
                        xe2.InnerText = TextBox5.Text
                    End If
                    &#039;Exit For &#039;找到退出来就可以了
                Next xn1
                Exit For
            End If
        Next xn
        xmlDoc.Save(&quot;111.xml&quot;) &#039;保存。
        Button3_Click(Nothing, Nothing)     &#039;refrest
    End Sub
</pre>
<p>本文代码均为实现代码,使用时可以根据实际需求进行优化..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/746.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>css中单位px和em的区别</title>
		<link>http://www.islandcn.com/post/744.html</link>
		<comments>http://www.islandcn.com/post/744.html#comments</comments>
		<pubDate>Wed, 24 Mar 2010 08:23:55 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[html/xhtml]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[DIV]]></category>

		<category><![CDATA[em]]></category>

		<category><![CDATA[html]]></category>

		<category><![CDATA[px]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=744</guid>
		<description><![CDATA[国内的设计师大都喜欢用px，而国外的网站大都喜欢用em，那么两者有什么区别，又各自有什么优劣呢？
1. IE无法调整那些使用px作为单位的字体大小；
2. 国外的大部分网站能够调整的原因在于其使用了em作为字体单位；
3. Firefox能够调整px和em，但是96%以上的中国网民使用IE浏览器(或内核)。
px像素（Pixel）。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。(引自CSS2.0手册) 
em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置，则相对于浏览器的默认字体尺寸。(引自CSS2.0手册)
任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算，需要在css中的body选择器中声明Font-size=62.5%，这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10，然后换上em作为单位就行了。
em有如下特点：
1. em的值并不是固定的；
2. em会继承父级元素的字体大小。
所以我们在写CSS的时候，需要注意两点：
1. body选择器中声明Font-size=62.5%；
2. 将你的原来的px数值除以10，然后换上em作为单位；
3. 重新计算那些被放大的字体的em数值。避免字体大小的重复声明。
也就是避免1.2 * 1.2= 1.44的现象。比如说你在#content中声明了字体大小为1.2em，那么在声明p的字体大小时就只能是1em，而不是1.2em, 因为此em非彼em，它因继承#content的字体高而变为了1em=12px。
但是12px汉字例外，就是由以上方法得到的12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小，而是稍大一点。这个问题 Jorux已经解决，只需在body选择器中把62.5%换成63%就能正常显示了。原因可能是IE处理汉字时，对于浮点的取值精确度有限。不知道有没有其他的解释。
]]></description>
			<content:encoded><![CDATA[<p>国内的设计师大都喜欢用px，而国外的网站大都喜欢用em，那么两者有什么区别，又各自有什么优劣呢？</p>
<p>1. IE无法调整那些使用px作为单位的字体大小；<br />
2. 国外的大部分网站能够调整的原因在于其使用了em作为字体单位；<br />
3. Firefox能够调整px和em，但是96%以上的中国网民使用IE浏览器(或内核)。</p>
<p>px像素（Pixel）。相对长度单位。像素px是相对于显示器屏幕分辨率而言的。(引自CSS2.0手册) </p>
<p>em是相对长度单位。相对于当前对象内文本的字体尺寸。如当前对行内文本的字体尺寸未被人为设置，则相对于浏览器的默认字体尺寸。(引自CSS2.0手册)</p>
<p>任意浏览器的默认字体高都是16px。所有未经调整的浏览器都符合: 1em=16px。那么12px=0.75em,10px=0.625em。为了简化font-size的换算，需要在css中的body选择器中声明Font-size=62.5%，这就使em值变为 16px*62.5%=10px, 这样12px=1.2em, 10px=1em, 也就是说只需要将你的原来的px数值除以10，然后换上em作为单位就行了。</p>
<p>em有如下特点：</p>
<p>1. em的值并不是固定的；<br />
2. em会继承父级元素的字体大小。</p>
<p>所以我们在写CSS的时候，需要注意两点：<br />
1. body选择器中声明Font-size=62.5%；<br />
2. 将你的原来的px数值除以10，然后换上em作为单位；<br />
3. 重新计算那些被放大的字体的em数值。避免字体大小的重复声明。</p>
<p>也就是避免1.2 * 1.2= 1.44的现象。比如说你在#content中声明了字体大小为1.2em，那么在声明p的字体大小时就只能是1em，而不是1.2em, 因为此em非彼em，它因继承#content的字体高而变为了1em=12px。</p>
<p>但是12px汉字例外，就是由以上方法得到的12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小，而是稍大一点。这个问题 Jorux已经解决，只需在body选择器中把62.5%换成63%就能正常显示了。原因可能是IE处理汉字时，对于浮点的取值精确度有限。不知道有没有其他的解释。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/744.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>15个CSS常识</title>
		<link>http://www.islandcn.com/post/742.html</link>
		<comments>http://www.islandcn.com/post/742.html#comments</comments>
		<pubDate>Wed, 24 Mar 2010 08:10:49 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[html/xhtml]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[DIV]]></category>

		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=742</guid>
		<description><![CDATA[    1、不要使用过小的图片做背景平铺。这就是为何很多人都不用 1px 的原因，这才知晓。宽高 1px 的图片平铺出一个宽高 200px 的区域，需要 200*200=40, 000 次，占用资源。
　　2、无边框。推荐的写法是 border:none;，哈哈，我一直在用这个。 border:0; 只是定义边框宽度为零，但边框样式、颜色还是会被浏览器解析，占用资源。
　　3、慎用 * 通配符。所谓通配符，就是将 CSS 中的所有标签均初始化，不管用的不用的，过时的先进的，一视同仁，这样，大大的占用资源。要有选择的初始化标签。
　　4、CSS 的十六进制颜色代码缩写。习惯了缩写及小写，这才知道，原来不是推荐的写法，为的是减少解析所占用的资源。但同时会增加文件体积。孰优孰劣，有待仔细考证。
　　5、样式放头上，脚本放脚下。不内嵌，只外链。
　　6、坚决不用 CSS 表达式。
　　7、使用 引用样式表，而不是通过 @import 导入。
　　8、一般来说，PNG 比 GIF 要小，小得多。再者，GIF 中有多少颜色是被浪费的，很值得优化。
　　9、千万不要在 HTML 中缩放图片，一者不好看，二者占资源。
　　10、正文字体最好用偶数，12px、14px、16px，效果非常好。特例，15px。
　　11、block、ul、ol 等上下留出至少一倍行距，左侧至少两倍行距，右侧随意。
　　12、段落之间，至少要有一倍行距。
　　13、强行指定某些元素的 line-height，正文 1.6 倍于文字大小，标题 1.3 倍。
　　14、中文标点用全角。英文夹杂在中文中，左右空格，半角。
　　15、中文字体的粗体和斜体，远离较好，利民利己。
]]></description>
			<content:encoded><![CDATA[<p>    1、不要使用过小的图片做背景平铺。这就是为何很多人都不用 1px 的原因，这才知晓。宽高 1px 的图片平铺出一个宽高 200px 的区域，需要 200*200=40, 000 次，占用资源。<br />
　　2、无边框。推荐的写法是 border:none;，哈哈，我一直在用这个。 border:0; 只是定义边框宽度为零，但边框样式、颜色还是会被浏览器解析，占用资源。<br />
　　3、慎用 * 通配符。所谓通配符，就是将 CSS 中的所有标签均初始化，不管用的不用的，过时的先进的，一视同仁，这样，大大的占用资源。要有选择的初始化标签。<br />
　　4、CSS 的十六进制颜色代码缩写。习惯了缩写及小写，这才知道，原来不是推荐的写法，为的是减少解析所占用的资源。但同时会增加文件体积。孰优孰劣，有待仔细考证。<br />
　　5、样式放头上，脚本放脚下。不内嵌，只外链。<br />
　　6、坚决不用 CSS 表达式。<br />
　　7、使用 引用样式表，而不是通过 @import 导入。<br />
　　8、一般来说，PNG 比 GIF 要小，小得多。再者，GIF 中有多少颜色是被浪费的，很值得优化。<br />
　　9、千万不要在 HTML 中缩放图片，一者不好看，二者占资源。<br />
　　10、正文字体最好用偶数，12px、14px、16px，效果非常好。特例，15px。<br />
　　11、block、ul、ol 等上下留出至少一倍行距，左侧至少两倍行距，右侧随意。<br />
　　12、段落之间，至少要有一倍行距。<br />
　　13、强行指定某些元素的 line-height，正文 1.6 倍于文字大小，标题 1.3 倍。<br />
　　14、中文标点用全角。英文夹杂在中文中，左右空格，半角。<br />
　　15、中文字体的粗体和斜体，远离较好，利民利己。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/742.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>苹果iPad平板电脑投票调查</title>
		<link>http://www.islandcn.com/post/733.html</link>
		<comments>http://www.islandcn.com/post/733.html#comments</comments>
		<pubDate>Fri, 29 Jan 2010 02:38:15 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[IT]]></category>

		<category><![CDATA[iPad]]></category>

		<category><![CDATA[平板电脑]]></category>

		<category><![CDATA[苹果]]></category>

		<category><![CDATA[调查]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=733</guid>
		<description><![CDATA[截至2010年1月29日,新浪网关于苹果iPad平板电脑投票调查结果:]]></description>
			<content:encoded><![CDATA[<p>截至2010年1月29日,<a href="http://www.sina.com.cn">新浪网</a>关于苹果iPad平板电脑投票调查结果:<br />
 </p>
<table border="0" cellspacing="1" cellpadding="0" width="500" align="center" bgcolor="#000000">
<tbody>
<tr>
<td colspan="6" bgcolor="#cb0808">
<p align="center"><strong><font color=black>你认为iPad最吸引你的是</font></strong></p>
</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">选项</td>
<td valign="top" bgcolor="#ffffff"><strong>比例</strong></td>
<td valign="top" bgcolor="#ffffff"><strong>票数</strong></td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">时尚外观设计</td>
<td valign="top" bgcolor="#ffffff"><strong>43.5%</strong></td>
<td valign="top" bgcolor="#ffffff">9,655</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">体积小巧便携</td>
<td valign="top" bgcolor="#ffffff"><strong>26.7%</strong></td>
<td valign="top" bgcolor="#ffffff">5,929</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">苹果金字招牌</td>
<td valign="top" bgcolor="#ffffff"><strong>23.6%</strong></td>
<td valign="top" bgcolor="#ffffff">5,240</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">其他</td>
<td valign="top" bgcolor="#ffffff"><strong>6.2%</strong></td>
<td valign="top" bgcolor="#ffffff">1,380</td>
</tr>
</tbody>
</table>
<p>我们从从苹果的产品来看,不管是从电话iPhone,音乐iPod,还是笔记本MacBook都可以归结于一个特点:就是时尚的外观设计,苹果产品外观设计上无可置疑是十分成功的.</p>
<table border="0" cellspacing="1" cellpadding="0" width="500" align="center" bgcolor="#000000">
<tbody>
<tr>
<td colspan="6" bgcolor="#cb0808">
<p align="center"><strong><font color=black>你认为苹果平板电脑合理售价是多少(折合人民币):</font></strong></p>
</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">选项</td>
<td valign="top" bgcolor="#ffffff"><strong>比例</strong></td>
<td valign="top" bgcolor="#ffffff"><strong>票数</strong></td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">4000元以内</td>
<td valign="top" bgcolor="#ffffff"><strong>63.7%</strong></td>
<td valign="top" bgcolor="#ffffff">14,144</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">4000元-6000元</td>
<td valign="top" bgcolor="#ffffff"><strong>24.8%</strong></td>
<td valign="top" bgcolor="#ffffff">5,504</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">6000元-8000元</td>
<td valign="top" bgcolor="#ffffff"><strong>7.4%</strong></td>
<td valign="top" bgcolor="#ffffff">1,637</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">8000元以上</td>
<td valign="top" bgcolor="#ffffff"><strong>4.1%</strong></td>
<td valign="top" bgcolor="#ffffff">919</td>
</tr>
</tbody>
</table>
<p>低价格依然是消费者关注的焦点</p>
<table border="0" cellspacing="1" cellpadding="0" width="500" align="center" bgcolor="#000000">
<tbody>
<tr>
<td colspan="6" bgcolor="#cb0808">
<p align="center"><strong><font color=black>你你是否会购买苹果平板电脑?</font></strong></p>
</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">选项</td>
<td valign="top" bgcolor="#ffffff"><strong>比例</strong></td>
<td valign="top" bgcolor="#ffffff"><strong>票数</strong></td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">会</td>
<td valign="top" bgcolor="#ffffff"><strong>44.1%</strong></td>
<td valign="top" bgcolor="#ffffff">9,798</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">看情况决定</td>
<td valign="top" bgcolor="#ffffff"><strong>36.5%</strong></td>
<td valign="top" bgcolor="#ffffff">8,095</td>
</tr>
<tr>
<td valign="top" bgcolor="#ef9c00">不会</td>
<td valign="top" bgcolor="#ffffff"><strong>19.4%</strong></td>
<td valign="top" bgcolor="#ffffff">4,311</td>
</tr>
</tbody>
</table>
<p>有80%的用户对iPad是比较有意向的.</p>
<p>感谢新浪网提供调查数据!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/733.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>未到伤心处，正是伤心时</title>
		<link>http://www.islandcn.com/post/731.html</link>
		<comments>http://www.islandcn.com/post/731.html#comments</comments>
		<pubDate>Thu, 24 Dec 2009 14:36:53 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Diary]]></category>

		<category><![CDATA[工作]]></category>

		<category><![CDATA[思念]]></category>

		<category><![CDATA[情感]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=731</guid>
		<description><![CDATA[不停地工作，不停地繁忙，不停地让自己动起来，不给自己宁静下来的机遇和理由，是为了让自己忘记应当忘却的东西。可当夜晚来临的时候，当深夜一个人的时候，谁能把持住自己的大脑？谁又能完整放下心中的所想和所思？]]></description>
			<content:encoded><![CDATA[<p>不停地工作，不停地繁忙，不停地让自己动起来，不给自己宁静下来的机遇和理由，是为了让自己忘记应当忘却的东西。可当夜晚来临的时候，当深夜一个人的时候，谁能把持住自己的大脑？谁又能完整放下心中的所想和所思？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/731.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>搞定ascii+md5+base64_decode加密</title>
		<link>http://www.islandcn.com/post/728.html</link>
		<comments>http://www.islandcn.com/post/728.html#comments</comments>
		<pubDate>Wed, 23 Dec 2009 05:04:09 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[IT]]></category>

		<category><![CDATA[ascii]]></category>

		<category><![CDATA[base64]]></category>

		<category><![CDATA[decode]]></category>

		<category><![CDATA[MD5]]></category>

		<category><![CDATA[加密]]></category>

		<category><![CDATA[解密]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=728</guid>
		<description><![CDATA[本来今天想写个解密程序的,但是想想为啥不借鉴下人家的加密算法呢?  所以自己弄明白就ok了,于是就放弃了. 但是思路还是跟大家分享下]]></description>
			<content:encoded><![CDATA[<div class="wp-caption alignnone" style="width: 725px"><a href="/wp-content/uploads/2009/12/asciifull.gif"><img alt="ascii+md5+base64_decode解密" src="/wp-content/uploads/2009/12/asciifull.gif" title="ascii+md5+base64_decode解密" width="400" height="300" /></a><p class="wp-caption-text">ascii+md5+base64_decode解密</p></div>
<p>老外的思路果然是牛.</p>
<p>本来今天想写个解密程序的,但是想想为啥不借鉴下人家的加密算法呢?  所以自己弄明白就ok了,于是就放弃了. 但是思路还是跟大家分享下</p>
<li>1.文件名称调用的时候用MD5加密</li>
<li>2.部分HTML内容用ASCII加密</li>
<li>3.部分HTML内容用Base64_decode 再次加密</li>
<p>PS:这玩意我用谷歌.CN  找了N次找不到一点点资料,还是谷歌.COM上找到些资料.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/728.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>得与失</title>
		<link>http://www.islandcn.com/post/724.html</link>
		<comments>http://www.islandcn.com/post/724.html#comments</comments>
		<pubDate>Tue, 22 Dec 2009 05:36:36 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Diary]]></category>

		<category><![CDATA[图片]]></category>

		<category><![CDATA[存储]]></category>

		<category><![CDATA[淘宝]]></category>

		<category><![CDATA[相册]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=724</guid>
		<description><![CDATA[今天经过不懈努力 终于搞定了图片存储(image hosting)方案,图片存储方案国内应用最多的就是"淘宝相册",也见过各种平台的ASP.NET的多些,而我选择的是PHP,目前汉化工作继续进行ing...]]></description>
			<content:encoded><![CDATA[<p>昨天很背,鸭子的QQ被盗,导致我被盗Q者拐走了88块人民币</p>
<p><strong>在这里提醒下各位朋友 QQ上任何人让你帮忙汇款/充卡等等 请电话审核后再确定.</strong></p>
<p>蜗牛说这是好数字   也是呢 谢谢安慰我的朋友</p>
<p> </p>
<p>今天经过不懈努力 终于搞定了图片存储(image hosting)方案,图片存储方案国内应用最多的就是&#8221;淘宝相册&#8221;,也见过各种平台的ASP.NET的多些,而我选择的是PHP,目前汉化工作继续进行ing&#8230;</p>
<p> </p>
<p>不得不承认国外的各种资源比国内丰富.</p>
<p>但是今天找英文资源有一个缺陷,但是严格的说不是什么缺陷,而且出现这种情况的几率几乎为零:网站的检索结果中重复内容少,如果你找的内容中地址已经失效这会很麻烦,今天就遇到这样的事,谷歌的检索结果中出现的两个我所需要的信息地址,域名已经全部失效了&#8230;然后不得不换关键词,换了N次找到我所需要的东西..我想形成这种差异的根源还是版权问题吧,老外对版权是相当重视的.一篇文章如果未经允许的情况下是不可以copy的.</p>
<p>而在中文环境下不存在这个问题,你无论找个资料在搜索引擎的检索结果中会出现N个重复的内容,一个地址失效那么pass,继续下一个.. 但是如果是软件同样存在盗链/死链等现象,无疑这会给你浪费掉很多时间&#8230;还有一个严重的现象,不得不提一下,即使你打开了你要找的内容,是否发现很难找到真正的下载地址呢??到处都是混淆视线的写着&#8221;立即下载&#8221;的广告图片呢?有的甚至绑了流氓软件,中国的互联网的确是十分混乱的..所以当你找软件的时候还是建议到.天空和华军这类大站去吧,直接脱离搜索引擎.没必要在它这上面浪费时间.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/724.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>机遇总是垂青于有思想、有准备和敢于尝试的人</title>
		<link>http://www.islandcn.com/post/722.html</link>
		<comments>http://www.islandcn.com/post/722.html#comments</comments>
		<pubDate>Mon, 07 Dec 2009 09:07:21 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[IT]]></category>

		<category><![CDATA[互联网]]></category>

		<category><![CDATA[创业]]></category>

		<category><![CDATA[商机]]></category>

		<category><![CDATA[机遇]]></category>

		<category><![CDATA[李嘉诚]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=722</guid>
		<description><![CDATA[谁也阻挡不住社会的发展和时代的进步。在潮流和趋势面前，谁先改变观念，谁就拥有了市场！信息时代，商机时代，信息和机遇相随相伴，而机遇总是垂青于有思想、有准备和敢于尝试的人.]]></description>
			<content:encoded><![CDATA[<p> </p>
<div id="blogDetailDiv" style="font-size: 16px;">
<p>李嘉诚说过：<a href="http://www.google.cn/search?hl=zh-CN&amp;newwindow=1&amp;q=%E4%BA%92%E8%81%94%E7%BD%91%E6%98%AF%E4%B8%80%E6%AC%A1%E6%96%B0%E7%9A%84%E5%95%86%E6%9C%BA%EF%BC%8C%E6%AF%8F%E4%B8%80%E6%AC%A1%E6%96%B0%E5%95%86%E6%9C%BA%E7%9A%84%E5%88%B0%E6%9D%A5%EF%BC%8C%E9%83%BD%E4%BC%9A%E9%80%A0%E5%B0%B1%E4%B8%80%E6%89%B9%E5%AF%8C%E7%BF%81&amp;aq=f&amp;oq=" target="_blank">互联网是一次新的商机，每一次新商机的到来，都会造就一批富翁</a></p>
<p> </p>
<p>造就富翁的原因是：当别人不理解他在做什么的时候,他理解他在做什么.当别人不明白他在做什么的时候,他明白他在做什么.当别人明白了,他富有了.当别人明白了,他成功了。</p>
<p>机会：你看不懂，你朋友看不懂，你的对手看得懂。<br />
事业：你不做，你身边的人不做，你未来的老板去做。</p>
<p>谁也阻挡不住社会的发展和时代的进步。在潮流和趋势面前，谁先改变观念，谁就拥有了市场！信息时代，商机时代，信息和机遇相随相伴，而机遇总是垂青于有思想、有准备和敢于尝试的人.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/722.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>带宽与实际下载速度的算法</title>
		<link>http://www.islandcn.com/post/719.html</link>
		<comments>http://www.islandcn.com/post/719.html#comments</comments>
		<pubDate>Thu, 29 Oct 2009 09:22:19 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[IT]]></category>

		<category><![CDATA[下载]]></category>

		<category><![CDATA[宽带]]></category>

		<category><![CDATA[带宽]]></category>

		<category><![CDATA[速度]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=719</guid>
		<description><![CDATA[很多用户可能对自己的下载速度和安装的网络带宽存在误区: 我安装的1M的带宽怎么下载速度连300KB都不到呢??.那么今天主要说下网络下载速度与带宽的关系.]]></description>
			<content:encoded><![CDATA[<p>很多用户可能对自己的下载速度和安装的网络带宽存在误区: 我安装的1M的带宽怎么下载速度连500KB都不到呢??.那么今天主要说下网络下载速度与带宽的关系.</p>
<p>所谓1M宽带,其实是指 1Mbps (bits per second),即 1 x 1024 / 8 = 128KB/sec，但这只是理论上的速度，实际上则要再扣约 12% 的 Ethernet Header, IP Header, TCP Header, ATM Header 等控制讯号,故其传输速度上限应为101KB/sec 左右.但是受现实中的各种原因的影响,可能还要比这个数字还要低,一般来说1M的速度不低于100KB/sec就不错了.<br />
写成公式即是:</p>
<blockquote><p>M 代表接入带宽,N表示实际带宽(这里的单位是kb,N的结果就是N kb/s)<br />
M * 1024 / 8= N</p></blockquote>
<p><strong>说简单的,就是所谓的多少M/K带宽除以8就得出实际的传输速度.</strong><br />
另外在传输单位的写法上,<span style="color: #ff0000;">B</span> 和 <span style="color: #0000ff;">b </span>分别代表<span style="color: #ff0000;"> Bytes </span>和 <span style="color: #0000ff;">bits</span>,两者的定义是不同的，千万不要混淆.</p>
<p>带宽单位之间的换算:</p>
<blockquote>
<li>1 Byte = 8 bits</li>
<li>1 Kb = 1024 bits</li>
<li>1 KB = 1024 bytes</li>
<li>1 Mb = 1024 Kb</li>
<li>1 MB = 1024 KB</li>
</blockquote>
<p>常用宽带最高下载理论值</p>
<blockquote>
<li>1.5 M =169 KB/s</li>
<li>2M=225.28KB/s</li>
<li>3 M =338 KB/s</li>
<li>6 M =676 KB/s</li>
<li>10 M =1126 KB/s</li>
</blockquote>
<p>　　以上谈到的是理论值,对于实际的连接速度可以通过下载文件的方法来测试,看看离理论值有多远,另外有一些网速测试网站,也可以测试家中正在使用的宽带服务质量.<br />
<strong>影响上 / 下传速度的因素: </strong></p>
<p>　　事实上,影响传输速度的因素很多,无论哪一家宽带服务供货商,都不能保证每个用户 24 小时均拥有均衡、全速的频宽,以下解说种种原因:</p>
<p>　　<strong>本地网络的地区频宽限制 </strong><br />
　　以一般 1M 或 512K 宽带为例,用户家中的 ADSL Modem 会直接接驳到机楼,再接驳至该区的总机楼,然后各区的总机楼再接驳到 ISP.如果该区的宽带用户特别多,而所有传输均要经由机楼与机楼之间的光纤完成,该区的光纤可传输总容量便会成为传输速度的樽颈.</p>
<p>　　<strong>不同国家地区的频宽限制 </strong><br />
　　在测试中,联机到美国地区的上传速度为 47.375KB/s,但曾经传送大型档案给美国的一位朋友,上传速度可达 4xxKB/s&lt;对方使用 FlashGet 软件&gt;故传输速度是否能达到 6M,也要视乎用户与该地区之间的频宽是否足够.</p>
<p>　　<strong>Peak Hour </strong><br />
　　所谓 Peak Hour,就是该地区的宽带用户同时上网比率最高的时段,极大量用户会在此段时间内浏览网页,下载档案,进行在线游戏等等,约该 ISP 的频宽总容量不足以分配 6M 于每个用户的话,频宽便会摊分开来,结果每个用户的最高频宽便会低于 6M,甚至只得更低的传输速度.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/719.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>SQL统计常用时间函数</title>
		<link>http://www.islandcn.com/post/717.html</link>
		<comments>http://www.islandcn.com/post/717.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 03:49:47 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[SQL]]></category>

		<category><![CDATA[函数]]></category>

		<category><![CDATA[时间]]></category>

		<category><![CDATA[查询]]></category>

		<category><![CDATA[统计]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=717</guid>
		<description><![CDATA[统计在数据库中是最常见也是必不可少的,前段时间用Teechat控件使用统计遇到的一些SQL语句整理一下,重点常用函数有datediff()和datepart(),下面大概讲述下这些函数.]]></description>
			<content:encoded><![CDATA[<p>统计在数据库中是最常见也是必不可少的,前段时间用Teechat控件使用统计遇到的一些SQL语句整理一下,重点常用函数有datediff()和datepart(),下面大概讲述下这些函数.</p>
<p>计算时间的函数中有,年(yy),季(q),月(m),周(ww),时期(w),天(d),时(hh),分(n),秒(s)</p>
<p>getdate():返回当前日期</p>
<p>获取当前月份的天数:</p>
<pre name="code" class="sql">

select datediff(d,getdate(),dateadd(m,1,getdate()))
</pre>
<p>获取当前年,季,月,周,天,时,分,秒:</p>
<pre name="code" class="sql">

select datepart(yy,getdate()) //年
select datepart(q,getdate())  //季
select datepart(m,getdate())  //月
select datepart(ww,getdate())//周
select datepart(w,getdate())  //星期,从0开始.
select datepart(d,getdate())  //天
select datepart(hh,getdate())//时
select datepart(n,getdate()) //分
select datepart(s,getdate()) //秒
</pre>
<p>获取当前天的前后五天日期:</p>
<pre name="code" class="sql">

select dateadd(dd,5,getdate())
select dateadd(dd,-5,getdate())
</pre>
<p>获取当前日期与目标日期相差的年,月,周,日,时,分,秒:</p>
<pre name="code" class="sql">

select datediff(yy,&#039;2005-01-01 14:12:01&#039;,getdate())
select datediff(q,&#039;2005-01-01 14:12:01&#039;,getdate())
select datediff(m,&#039;2005-01-01 14:12:01&#039;,getdate())
select datediff(ww,&#039;2005-01-01 14:12:01&#039;,getdate())
select datediff(d,&#039;2005-01-01 14:12:01&#039;,getdate())
select datediff(hh,&#039;2005-01-01 14:12:01&#039;,getdate())
select datediff(n,&#039;2005-01-01 14:12:01&#039;,getdate())
select datediff(s,&#039;2005-01-01 14:12:01&#039;,getdate())
</pre>
<p>获取当前月份添加的信息:</p>
<pre name="code" class="sql">

select count(*) as num, Origin from ks_article month(getdate())=DatePart(&quot;m&quot;,adddate) group by Origin
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/717.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server和Oracle常用时间日期处理语句</title>
		<link>http://www.islandcn.com/post/715.html</link>
		<comments>http://www.islandcn.com/post/715.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 03:41:50 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Database]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[处理]]></category>

		<category><![CDATA[日期]]></category>

		<category><![CDATA[时间]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=715</guid>
		<description><![CDATA[SQL Server和Oracle常用时间日期处理语句]]></description>
			<content:encoded><![CDATA[<p>在SQL语句中,常常用会对时间(或日期)进行一些处理,下面是比较通用的一些语句:</p>
<p>延迟:</p>
<pre name="code" class="sql">

sysdate+(5/24/60/60)          在系统时间基础上延迟5秒

sysdate+5/24/60               在系统时间基础上延迟5分钟

sysdate+5/24                  在系统时间基础上延迟5小时

sysdate+5                     在系统时间基础上延迟5天

add_months(sysdate,-5)        在系统时间基础上延迟5月

add_months(sysdate,-5*12)     在系统时间基础上延迟5年
</pre>
<p>上月末的日期:</p>
<pre name="code" class="sql">

select last_day(add_months(sysdate, -1)) from dual;
</pre>
<p>本月的最后一秒:</p>
<pre name="code" class="sql">

select trunc(add_months(sysdate,1),&#039;MM&#039;) - 1/24/60/60 from dual
</pre>
<p>本周星期一的日期:</p>
<pre name="code" class="sql">

select trunc(sysdate,&#039;day&#039;)+1 from dual
</pre>
<p>年初至今的天数:</p>
<pre name="code" class="sql">

select ceil(sysdate - trunc(sysdate, &#039;year&#039;)) from dual;
</pre>
<p>今天是今年的第几周 :</p>
<pre name="code" class="sql">

select to_char(sysdate,&#039;fmww&#039;) from dual
</pre>
<p>今天是本月的第几周:</p>
<pre name="code" class="sql">

SELECT TO_CHAR(SYSDATE,&#039;WW&#039;) - TO_CHAR(TRUNC(SYSDATE,&#039;MM&#039;),&#039;WW&#039;) + 1 AS &quot;weekOfMon&quot; FROM dual
</pre>
<p>本月的天数</p>
<pre name="code" class="sql">

SELECT to_char(last_day(SYSDATE),&#039;dd&#039;) days FROM dual
</pre>
<p>今年的天数 </p>
<pre name="code" class="sql">

select add_months(trunc(sysdate,&#039;year&#039;), 12) - trunc(sysdate,&#039;year&#039;) from dual
</pre>
<p>下个星期一的日期</p>
<pre name="code" class="sql">

SELECT Next_day(trunc(SYSDATE),&#039;monday&#039;) FROM dual
</pre>
<p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
<p><strong>计算工作日方法</strong>
<pre name="code" class="sql">

create table t(s date,e date);

alter session set nls_date_format = &#039;yyyy-mm-dd&#039;;

insert into t values(&#039;2003-03-01&#039;,&#039;2003-03-03&#039;);

insert into t values(&#039;2003-03-02&#039;,&#039;2003-03-03&#039;);

insert into t values(&#039;2003-03-07&#039;,&#039;2003-03-08&#039;);

insert into t values(&#039;2003-03-07&#039;,&#039;2003-03-09&#039;);

insert into t values(&#039;2003-03-05&#039;,&#039;2003-03-07&#039;);

insert into t values(&#039;2003-02-01&#039;,&#039;2003-03-31&#039;);

-- 这里假定日期都是不带时间的,否则在所有日期前加trunc即可.

select s,e,e-s+1 total_days, trunc((e-s+1)/7)*5 + length(replace(substr(&#039;01111100111110&#039;,to_char(s,&#039;d&#039;),mod(e-s+1,7)),&#039;0&#039;,&#039;&#039;)) work_days from t;

-- drop table t;
</pre>
<p>====================================================</p>
<p><strong>判断当前时间是上午下午还是晚上</strong></p>
<pre name="code" class="sql">

SELECT CASE
WHEN to_number(to_char(SYSDATE,&#039;hh24&#039;)) BETWEEN 6 AND 11 THEN &#039;上午&#039;

WHEN to_number(to_char(SYSDATE,&#039;hh24&#039;)) BETWEEN 11 AND 17 THEN &#039;下午&#039;

WHEN to_number(to_char(SYSDATE,&#039;hh24&#039;)) BETWEEN 17 AND 21 THEN &#039;晚上&#039;

END

FROM dual;
</pre>
<p>===================================================</p>
<p><strong>Oracle 中的一些处理日期</strong></p>
<p>将数字转换为任意时间格式.如秒:需要转换为天/小时</p>
<pre name="code" class="sql">

SELECT to_char(floor(TRUNC(936000/(60*60))/24))||&#039;天&#039;||to_char(mod(TRUNC(936000/(60*60)),24))||&#039;小时&#039; FROM DUAL
</pre>
<p>TO_DATE格式 </p>
<pre name="code" class="sql">

Day: 

dd number 12 

dy abbreviated fri 

day spelled out friday 

ddspth spelled out, ordinal twelfth 

Month: 

mm number 03 

mon abbreviated mar 

month spelled out march 

Year: 

yy two digits 98 

yyyy four digits 1998 
</pre>
<p>24小时格式下时间范围为: 0:00:00 - 23:59:59&#8230;. </p>
<p>12小时格式下时间范围为: 1:00:00 - 12:59:59 &#8230;. </p>
<p><strong>1. 日期和字符转换函数</strong></p>
<p>用法(to_date,to_char) </p>
<p><strong>2. </strong></p>
<pre name="code" class="sql">

select to_char( to_date(222,&#039;J&#039;),&#039;Jsp&#039;) from dual 
</pre>
<p>显示Two Hundred Twenty-Two </p>
<p><strong>3. 求某天是星期几 </strong>
<pre name="code" class="sql">

select to_char(to_date(&#039;2002-08-26&#039;,&#039;yyyy-mm-dd&#039;),&#039;day&#039;) from dual; 

select to_char(to_date(&#039;2002-08-26&#039;,&#039;yyyy-mm-dd&#039;),&#039;day&#039;,&#039;NLS_DATE_LANGUAGE = American&#039;) from dual; 
</pre>
<p>设置日期语言 </p>
<pre name="code" class="sql">

ALTER SESSION SET NLS_DATE_LANGUAGE=&#039;AMERICAN&#039;; 
</pre>
<p>也可以这样 </p>
<pre name="code" class="sql">

TO_DATE (&#039;2002-08-26&#039;, &#039;YYYY-mm-dd&#039;, &#039;NLS_DATE_LANGUAGE = American&#039;) 
</pre>
<p><strong>4. 两个日期间的天数 </strong></p>
<pre name="code" class="sql">

select floor(sysdate - to_date(&#039;20020405&#039;,&#039;yyyymmdd&#039;)) from dual; 
</pre>
<p><strong>5. 时间为null的用法 </strong>
<pre name="code" class="sql">

select id, active_date from table1
UNION
select 1, TO_DATE(null) from dual; 
</pre>
<p>注意要用TO_DATE(null) </p>
<p><strong>6. </strong></p>
<pre name="code" class="sql">

a_date between to_date(&#039;20011201&#039;,&#039;yyyymmdd&#039;) and to_date(&#039;20011231&#039;,&#039;yyyymmdd&#039;) 
</pre>
<p>那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的. </p>
<p>所以,当时间需要精确的时候,觉得to_char还是必要的 </p>
<p><strong>7. 日期格式冲突问题 </strong></p>
<p>输入的格式要看你安装的ORACLE字符集的类型, 比如: </p>
<p>US7ASCII, date格式的类型就是: &#8216;01-Jan-01&#8242; </p>
<pre name="code" class="sql">

alter system set NLS_DATE_LANGUAGE = American 

alter session set NLS_DATE_LANGUAGE = American 
</pre>
<p>或者在to_date中写 </p>
<pre name="code" class="sql">

select to_char(to_date(&#039;2002-08-26&#039;,&#039;yyyy-mm-dd&#039;),&#039;day&#039;,&#039;NLS_DATE_LANGUAGE = American&#039;) from dual; 
</pre>
<p>注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看 </p>
<pre name="code" class="sql">

select * from nls_session_parameters
select * from V$NLS_PARAMETERS 
</pre>
<p><strong>8. </strong></p>
<pre name="code" class="sql">

select count(*)
from ( select rownum-1 rnum
from all_objects
where rownum &lt;= to_date(&#039;2002-02-28&#039;,&#039;yyyy-mm-dd&#039;) - to_date(&#039;2002-02-01&#039;,&#039;yyyy-mm-dd&#039;)+1 )
where to_char( to_date(&#039;2002-02-01&#039;,&#039;yyyy-mm-dd&#039;)+rnum-1, &#039;D&#039; )
not in ( &#039;1&#039;, &#039;7&#039; ) 
</pre>
<p>查找2002-02-28至2002-02-01间除星期一和七的天数 </p>
<p>在前后分别调用DBMS_UTILITY.GET_TIME, 然后将结果相减(得到的是1/100秒, 而不是毫秒). </p>
<p><strong>9. </strong></p>
<pre name="code" class="sql">

select months_between(to_date(&#039;01-31-1999&#039;,&#039;MM-DD-YYYY&#039;),
to_date(&#039;12-31-1998&#039;,&#039;MM-DD-YYYY&#039;)) &quot;MONTHS&quot; FROM DUAL;
1
select months_between(to_date(&#039;02-01-1999&#039;,&#039;MM-DD-YYYY&#039;),
to_date(&#039;12-31-1998&#039;,&#039;MM-DD-YYYY&#039;)) &quot;MONTHS&quot; FROM DUAL;
1.03225806451613 
</pre>
<p><strong>10. Next_day的用法 </strong>
<pre name="code" class="sql">

Next_day(date, day) 

Monday-Sunday, for format code DAY
Mon-Sun,       for format code DY
1-7,           for format code D 
</pre>
<p><strong>11 </strong></p>
<pre name="code" class="sql">

select to_char(sysdate,&#039;hh:mi:ss&#039;) TIME from all_objects 
</pre>
<p>注意:第一条记录的TIME 与最后一行是一样的 </p>
<p>可以建立一个函数来处理这个问题 </p>
<pre name="code" class="sql">

create or replace function sys_date return date is
begin
return sysdate;
end;
select to_char(sys_date,&#039;hh:mi:ss&#039;) from all_objects; 
</pre>
<p><strong>12. 获得小时数 </strong>
<pre name="code" class="sql">

SQL&gt; select sysdate ,to_char(sysdate,&#039;hh&#039;) from dual;
SYSDATE TO_CHAR(SYSDATE,&#039;HH&#039;) 
</pre>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
2003-10-13 19:35:21 07 </p>
<pre name="code" class="sql">

SQL&gt; select sysdate ,to_char(sysdate,&#039;hh24&#039;) from dual; 

SYSDATE TO_CHAR(SYSDATE,&#039;HH24&#039;) 
</pre>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>2003-10-13 19:35:21 19 </p>
<p>获取年月日与此类似 </p>
<p><strong>13. 年月日的处理 </strong>
<pre name="code" class="sql">

select older_date,
newer_date,
years,
months, 

abs( trunc( newer_date-add_months( older_date,years*12+months ) ) days from ( select trunc(months_between( newer_date, older_date )/12) YEARS, mod(trunc(months_between( newer_date, older_date )), 
</pre>
<p>12 ) MONTHS, </p>
<pre name="code" class="sql">

newer_date,
older_date
from ( select hiredate older_date,
add_months(hiredate,rownum)+rownum newer_date from emp ) ) 
</pre>
<p><strong>14. 处理月份天数不定的办法 </strong></p>
<pre name="code" class="sql">

select to_char(add_months(last_day(sysdate) +1, -2), &#039;yyyymmdd&#039;),last_day(sysdate) from dual 
</pre>
<p><strong>16. 找出今年的天数 </strong>
<pre name="code" class="sql">

select add_months(trunc(sysdate,&#039;year&#039;), 12) - trunc(sysdate,&#039;year&#039;) from dual 
</pre>
<p>闰年的处理方法 </p>
<pre name="code" class="sql">

to_char( last_day( to_date(&#039;02&#039; | | :year,&#039;mmyyyy&#039;) ), &#039;dd&#039; ) 
</pre>
<p>如果是28就不是闰年 </p>
<p><strong>17. yyyy与rrrr的区别 </strong></p>
<p>&#8216;YYYY99 TO_C </p>
<p>&#8212;&#8212;- &#8212;- </p>
<p>yyyy 99 0099 </p>
<p>rrrr 99 1999 </p>
<p>yyyy 01 0001 </p>
<p>rrrr 01 2001 </p>
<p><strong>18.不同时区的处理 </strong>
<pre name="code" class="sql">

select to_char( NEW_TIME( sysdate, &#039;GMT&#039;,&#039;EST&#039;), &#039;dd/mm/yyyy hh:mi:ss&#039;) ,sysdate
from dual; 
</pre>
<p><strong>19.  5秒钟一个间隔 </strong>
<pre name="code" class="sql">

Select TO_DATE(FLOOR(TO_CHAR(sysdate,&#039;SSSSS&#039;)/300) * 300,&#039;SSSSS&#039;) ,TO_CHAR(sysdate,&#039;SSSSS&#039;)
from dual 
</pre>
<p>TO_DATE(FL TO_CH</p>
<p>&#8212;&#8212;&#8212;- &#8212;&#8211;</p>
<p>2007-01-01 60368</p>
<p>SSSSS表示5位秒数 </p>
<p><strong>20. 一年的第几天 </strong>
<pre name="code" class="sql">

select TO_CHAR(SYSDATE,&#039;DDD&#039;),sysdate from dual 
</pre>
<p>TO_ SYSDATE</p>
<p>&#8212; &#8212;&#8212;&#8212;-</p>
<p>017 2007-01-17</p>
<p><strong>21.计算小时,分,秒,毫秒 </strong>
<pre name="code" class="sql">

select
Days,
A,
TRUNC(A*24) Hours,
TRUNC(A*24*60 - 60*TRUNC(A*24)) Minutes,
TRUNC(A*24*60*60 - 60*TRUNC(A*24*60)) Seconds,
TRUNC(A*24*60*60*100 - 100*TRUNC(A*24*60*60)) mSeconds
from
( select trunc(sysdate) Days, sysdate - trunc(sysdate) A
from dual
) 

select * from tabname
order by decode(mode,&#039;FIFO&#039;,1,-1)*to_char(rq,&#039;yyyymmddhh24miss&#039;); 

// 

floor((date2-date1) /365)      作为年
floor((date2-date1, 365) /30)  作为月
mod(mod(date2-date1, 365), 30) 作为日. 
</pre>
<p><strong>22.next_day函数 </strong></p>
<p>next_day(sysdate,6)是从当前开始下一个星期五.后面的数字是从星期日开始算起. </p>
<p>1 2 3 4 5 6 7 </p>
<p>日 一 二 三 四 五 六 </p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; </p>
<pre name="code" class="sql">

select (sysdate-to_date(&#039;2003-12-03 12:55:45&#039;,&#039;yyyy-mm-dd hh24:mi:ss&#039;))*24*60*60 from dual 
</pre>
<p>日期 返回的是天 然后 转换为ss</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/715.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>sql语句中日期时间格式化查询</title>
		<link>http://www.islandcn.com/post/713.html</link>
		<comments>http://www.islandcn.com/post/713.html#comments</comments>
		<pubDate>Tue, 27 Oct 2009 03:25:06 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[SQL]]></category>

		<category><![CDATA[时间]]></category>

		<category><![CDATA[查询]]></category>

		<category><![CDATA[格式化]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=713</guid>
		<description><![CDATA[在日常做日期处理查询的时候,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式"2009-10-27 14:32:12"当我们在查询2009-10-27是否与它相等,结果是不相等的.]]></description>
			<content:encoded><![CDATA[<p>在日常做日期处理查询的时候,我发现以前的搜索时间方式不太科学,效率也不是太高.由其是在查询指定的时间相等的时候,我在数据库中都存这样的时间格式&#8221;2009-10-27 14:32:12&#8243;当我们在查询2009-10-27是否与它相等,结果是不相等的.</p>
<p>所我们都喜欢找其它途径来解决这个问题。但是我发现我们的方法都不是太好，因为我们有的时候对sql sever的语句特性还了解的不够彻底。所以我查询了查sql server有帮助,终于发现个好东西,可以解决这个问题.</p>
<p>CONVERT 函数,可以解决这个问题,能将2007-5-22 14:32:12这样的时间在查询或where 子句中格式化为:2007-5-22;</p>
<p>如下:</p>
<p>我将查询用户的注册时间 UserRegisterTime</p>
<pre name="code" class="sql">

select * from [user] where UserActive=0 and replace(CONVERT(char(10),UserRegisterTime,111),&#039;/&#039;,&#039;-&#039;)=&#039;2007-05-22&#039; order by UserRegisterTime desc
</pre>
<p>在这其中关键的一句</p>
<pre name="code" class="sql">

replace(CONVERT(char(10),UserRegisterTime,111),&#039;/&#039;,&#039;-&#039;);
</pre>
<p>为什么我要replace将convert中的&#8221;/&#8221;符,换成&#8221;-&#8221;呢.是因为convert在这里格式化出来的时间是:2007/05/22</p>
<p>还要特别说明一点:convert格式化出为的时间都是带有前有0的格式,比如2007-1-1 12:12:31结果为:</p>
<p>2007-01-01,所以你在查询前务必要将你的日期中的月和日中小于10（不包括10）的数字加上前导0,</p>
<p>如：1就应该为01</p>
<p>此涵数的具体用法如下:</p>
<p>转换函数</p>
<p>当 Microsoft® SQL Server? 2000 不自动执行不同数据类型的表达式转换时，可使用转换函数 CAST 和 CONVERT 进行转换。这些转换函数还可用来获得各种特殊的数据格式。这两个转换函数都可用于选择列表、Where 子句和允许使用表达式的任何地方。</p>
<p>如果希望 Transact-SQL 程序代码遵从 SQL-92 标准，请使用 CAST 而不要使用 CONVERT。如果要利用 CONVERT 中的样式功能，请使用 CONVERT 而不要使用 CAST。</p>
<p>使用 CAST 或 CONVERT 时，需要两条信息：</p>
<p>要转换的表达式（例如，销售报告要求销售数据从货币型数据转换为字符型数据）。</p>
<p>要将所给表达式转换到的数据类型，例如，varchar 或 SQL Server 提供的任何其它数据类型。</p>
<p>除非将被转换的值存储起来，否则转换仅在 CAST 或 CONVERT 函数的作用期内有效。</p>
<p>在下面的示例中，第一个 Select 语句中使用 CAST，第二个 Select 语句中使用 CONVERT，将 title 列转换为 char(50) 列，以使结果更可读：</p>
<pre name="code" class="sql">

USE pubs

Select CAST(title AS char(50)), ytd_sales
FROM titles
Where type = &#039;trad_cook&#039;
</pre>
<p>或</p>
<pre name="code" class="sql">

USE pubs

Select CONVERT(char(50), title), ytd_sales
FROM titles
Where type = &#039;trad_cook&#039;
</pre>
<p>下面是结果集：（对任何一个查询）</p>
<p>ytd_sales</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8211;</p>
<p>Onions, Leeks, and Garlic: Cooking Secrets of the 375</p>
<p>Fifty Years in Buckingham Palace Kitchens 15096</p>
<p>Sushi, Anyone? 4095</p>
<p>(3 row(s) affected)</p>
<p>在下面的示例中，int 类型的ytd_sales 列转换为 char(20) 列，从而可以对该列使用 LIKE 谓词：</p>
<pre name="code" class="sql">

USE pubs
Select title, ytd_sales
FROM titles
Where CAST(ytd_sales AS char(20)) LIKE &#039;15%&#039;
AND type = &#039;trad_cook&#039;
</pre>
<p>下面是结果集：</p>
<p>Title ytd_sales</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;</p>
<p>Fifty Years in Buckingham Palace Kitchens 15096</p>
<p>(1 row(s) affected)</p>
<p>SQL Server 自动处理某些数据类型的转换。例如，如果比较 char 和 datetime 表达式、smallint 和 int 表达式、或不同长度的 char 表达式，SQL Server 可将它们自动转换。这种转换称为隐性转换。对这些转换不必使用 CAST 函数。但是，在下列情况下使用 CAST 都是可以接受的：</p>
<p>两个表达式的数据类型完全相同。</p>
<p>两个表达式可隐性转换。</p>
<p>必须显式转换数据类型。</p>
<p>如果试图进行不可能的转换（例如，将含有字母的 char 表达式转换为 int 类型），SQL Server 将显示一条错误信息。</p>
<p>如果转换时没有指定数据类型的长度，则 SQL Server 自动提供长度为 30。</p>
<p>转换为 datetime 或 smalldatetime 时，SQL Server 将拒绝所有无法识别为日期的值（包括 1753 年 1 月 1 日以前的日期）。当日期处于适当的范围内（1900 年 1 月 1 日到 2079 年 6 月 6 日）时，可将 datetime 值转换为 smalldatetime。时间值被四舍五入为最接近的分钟数。</p>
<p>转换为 bit 将把任何非零值都更改为 1。</p>
<p>转换为 money 或 smallmoney 时，整数后将加上货币单位。例如，整数值 4 被转换为货币时相当于 4 美元（对于默认语言 us_english）。浮点值的小数部分将四舍五入为四位小数以用于 money 值。将要转换为整数数据类型的 char 或 varchar 数据类型的表达式中，只能包含数字和可选的加号或减号（+ 或 -）。将忽略前导空格。要转换为 money 的 char 或 varchar 数据类型的表达式，还可包含可选的小数点和前导美元符号 ($)。</p>
<p>要转换为 float 或 real 数据类型的 char 或 varchar 类型表达式还可选择性地包含指数符号（e 或 E，后面有可选的 + 或 – 符号，再后面是数字）。</p>
<p>将字符表达式转换为其它大小的数据类型时，对于新的数据类型过长的值将被截断，SQL Server 将在 osql 实用工具和 SQL 查询分析器中显示星号 (*)。若数字表达式对于新的数据类型太长而无法显示，值将截断。下面是字符截断的示例：</p>
<pre name="code" class="sql">

USE pubs
Select SUBSTRING(title, 1, 25) AS Title, CONVERT(char(2), ytd_sales)
FROM titles
Where type = &#039;trad_cook&#039;
</pre>
<p>下面是结果集：</p>
<p>Title</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8211;</p>
<p>Onions, Leeks, and Garlic *</p>
<p>Fifty Years in Buckingham *</p>
<p>Sushi, Anyone? *</p>
<p>(3 row(s) affected)</p>
<p>在进行数据类型转换时，若目标数据类型的小数位数小于源数据类型的小数位数，则该值将被截断。例如，CAST(10.3496 AS money) 的结果是 $10.35。</p>
<p>可将 text 数据显式转换为 char 或 varchar，将 image 显式转换为 binary 或 varbinary。由于这些数据类型被限制为 8,000 个字符，所以转换也限制为 character 和 binary 数据类型的最大长度，即 8,000 个字符。可将 ntext 数据显式转换为 nchar 或 nvarchar，但最大长度为 4,000 个字符。如果没有指定长度，被转换的值的默认长度为 30 个字符。不支持隐式转换。</p>
<p>style 参数</p>
<p>将 datetime 数据转换为 char 或 varchar 数据时，CONVERT 的 style 参数提供了各种日期显示格式。为 style 参数提供的数值确定了 datetime 数据的显示方式。年份可以显示为两位或四位数。默认情况下，SQL Server 将年份显示为两位数。若要显示包括世纪的四位数年份 (yyyy)（即使年份数据是使用两位数的年份格式存储的），请给 style 值加 100 以获得四位数年份。</p>
<p>　Convert的使用方法：</p>
<p>　　格式：</p>
<pre name="code" class="sql">

Convert(data_type,expression[,style])
</pre>
<p>　　说明：此样式一般在时间类型(datetime,smalldatetime)与字符串类型(nchar,nvarchar,char,varchar)相互转换的时候才用到.</p>
<p>　　例子：</p>
<pre name="code" class="sql">

Select Convert(varchar(30),getdate(),101) now
</pre>
<p>　　结果为</p>
<p>　　now</p>
<p>　　09/15/2001</p>
<p>　　style数字在转换时间时的含义如下：</p>
<table border="1" cellspacing="1" cellpadding="1">
<tbody>
<tr>
<td>Style(2位表示年份)</td>
<td>Style(4位表示年份)</td>
<td>输入输出格式</td>
</tr>
<tr>
<td>0</td>
<td>100</td>
<td>mon dd yyyy hh：miAM(或PM)</td>
</tr>
<tr>
<td>1&nbsp;&nbsp;&nbsp;</td>
<td>101</td>
<td>mm/dd/yy</td>
</tr>
<tr>
<td>2</td>
<td>102</td>
<td>yymmdd</td>
</tr>
<tr>
<td>3</td>
<td>103</td>
<td>dd/mm/yy</td>
</tr>
<tr>
<td>4</td>
<td>104</td>
<td>ddmmyy</td>
</tr>
<tr>
<td>5</td>
<td>105</td>
<td>ddmmyy</td>
</tr>
<tr>
<td>6</td>
<td>106</td>
<td>dd mon yy</td>
</tr>
<tr>
<td>7</td>
<td>107</td>
<td>mon dd,yy</td>
</tr>
<tr>
<td>8</td>
<td>108</td>
<td>hh：mm：ss</td>
</tr>
<tr>
<td>9</td>
<td>109</td>
<td>mon dd yyyy hh：mi：ss：mmmmAM(或PM)</td>
</tr>
<tr>
<td>10</td>
<td>110</td>
<td>mmddyy</td>
</tr>
<tr>
<td>11</td>
<td>111</td>
<td>yy/mm/dd</td>
</tr>
<tr>
<td>12</td>
<td>112</td>
<td>yymmdd</td>
</tr>
<tr>
<td>13</td>
<td>113</td>
<td>dd mon yyyy hh：mi：ss：mmm(24小时制)</td>
</tr>
<tr>
<td>14</td>
<td>114</td>
<td>hh：mi：ss：mmm(24小时制)</td>
</tr>
<tr>
<td>20</td>
<td>120</td>
<td>yyyymmdd hh：mi：ss(24小时制)</td>
</tr>
<tr>
<td>21</td>
<td>121</td>
<td>yyyymmdd hh：mi：ss：mmm(24小时制)</td>
</tr>
</tbody>
</table>
<p>以下示例显示用 style 参数进行转换：</p>
<p>Select CONVERT(char(12), GETDATE(), 3)</p>
<p>此语句把当前日期转换为样式 3，dd/mm/yy。</p>
<p>在这里我附上一些实例：</p>
<pre name="code" class="sql">

select CONVERT(varchar, getdate(), 120 )

2004-09-12 11:06:08

select replace(replace(replace(CONVERT(varchar, getdate(), 120 ),&#039;-&#039;,&#039;&#039;),&#039; &#039;,&#039;&#039;),&#039;:&#039;,&#039;&#039;)

20040912110608

select CONVERT(varchar(12) , getdate(), 111 )

2004/09/12

select CONVERT(varchar(12) , getdate(), 112 )

20040912

select CONVERT(varchar(12) , getdate(), 102 )

2004.09.12

select CONVERT(varchar(12) , getdate(), 101 )

09/12/2004

select CONVERT(varchar(12) , getdate(), 103 )

12/09/2004

select CONVERT(varchar(12) , getdate(), 104 )

12.09.2004

select CONVERT(varchar(12) , getdate(), 105 )

12-09-2004

select CONVERT(varchar(12) , getdate(), 106 )

12 09 2004

select CONVERT(varchar(12) , getdate(), 107 )

09 12, 2004

select CONVERT(varchar(12) , getdate(), 108 )

11:06:08

select CONVERT(varchar(12) , getdate(), 109 )

09 12 2004 1

select CONVERT(varchar(12) , getdate(), 110 )

09-12-2004

select CONVERT(varchar(12) , getdate(), 113 )

12 09 2004 1

select CONVERT(varchar(12) , getdate(), 114 )

11:06:08.177
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/713.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>德语小记</title>
		<link>http://www.islandcn.com/post/710.html</link>
		<comments>http://www.islandcn.com/post/710.html#comments</comments>
		<pubDate>Wed, 14 Oct 2009 09:05:34 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[Diary]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[德国]]></category>

		<category><![CDATA[德语]]></category>

		<category><![CDATA[谷歌]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=710</guid>
		<description><![CDATA[注意:在德语版的谷歌中你看到的所有商标除外的所有文字都是德语(譬如Google这类商品型的品牌全球都是这么写的),请勿跟英文混淆.在德语中,"德国/德文"的写法是  "Deutsch" , 这是德国的国家域名为什么是 ".de"  的原因.]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>谷歌是个很好的老师</p>
<p>第一步从<a href="http://www.google.com" target="_blank">谷歌</a>出发吧</p>
<p>谷歌的德国站</p>
<p><a href="http://www.google.com/webhp?hl=de">http://www.google.com/webhp?hl=de</a></p>
<p> </p>
<p>第二步</p>
<p>德语版的谷歌语言工具</p>
<p><a href="http://www.google.com/language_tools?hl=de">http://www.google.com/language_tools?hl=de</a></p>
<p>很强悍的语言工具,可以翻译单词/词组 虽然翻译的不是很完美但是基本能明白大意了.</p>
<p>除了单词/句子翻译功能之外,她还可以翻译网页.</p>
<p> </p>
<p><span style="color: #000000;">注意:在德语版的谷歌中你看到的所有商标除外的所有文字都是德语(譬如Google这类商品型的品牌全球都是这么写的),请勿跟英文混淆.</span><span style="color: #000000;">在德语中,&#8221;<strong>德国/德文</strong>&#8220;的写法是  &#8220;<strong>Deutsch&#8221;</strong> , 这是德国的国家域名为什么是 &#8220;<strong>.de&#8221;  </strong>的原因.</span></p>
<p> </p>
<p><span style="color: #000000;">&#8220;<strong>中文(简体)</strong>&#8221; 的写法是 <strong>Chinesisch(traditionell)</strong></span></p>
<p> </p>
<p>先写两点吧,做个小标记!</p>
<p> </p>
<p>OH NO,忘记补充了怎么到德语版的谷歌中去的了,需要修改下谷歌默认语言,首先打开谷歌的国际版<a href="http://www.google.com/">www.google.com</a> 然后右上角可以看到 <a href="http://www.google.com/preferences?hl=en">Search settings</a>  ,点击进入设置 在&#8221; <strong>Interface Language </strong>&#8221; 这项中设置成相应的语言,英文的很方便吧,直接下拉选择成 &#8220;<strong>Garman</strong>&#8221; 就OK了,其它的就不用设置了,最后别忘记点右上角的&#8221;<strong>Save Preferences</strong>&#8220;按钮来保存设置.如果不这样设置 下次打开它还是你之前的默认语言的.<br />
最后补充说明下: 最好安装两个种类不一样的浏览器,我用的分别是IE7和FireFox,IE7给我日常使用,就是中文环境下,FireFox完全上别的语言的站点.谷歌搜索设置中可以设置你需要的检索结果站点的语言.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/710.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>SQL常用语句之字段名查询/建索引/增加字段/区间记录集查询</title>
		<link>http://www.islandcn.com/post/707.html</link>
		<comments>http://www.islandcn.com/post/707.html#comments</comments>
		<pubDate>Mon, 28 Sep 2009 09:50:49 +0000</pubDate>
		<dc:creator>kinglife</dc:creator>
		
		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[SQL]]></category>

		<category><![CDATA[字段]]></category>

		<category><![CDATA[查询]]></category>

		<category><![CDATA[索引]]></category>

		<category><![CDATA[触发器]]></category>

		<category><![CDATA[记录]]></category>

		<guid isPermaLink="false">http://www.islandcn.com/?p=707</guid>
		<description><![CDATA[关于SQL SERVER的常用维护/查询/优化等在之前有写过一些SQL Server查询优化方案整理、SQL触发器教程以及一些常用的行列转换等sql语句,今天再次整理下最近用到的SQL语句:指定表的字段名查询/索引的建立/增加字段/区间记录的SQL查询语句.]]></description>
			<content:encoded><![CDATA[<p><strong>导读</strong>:关于SQL SERVER的常用维护/查询/优化等在之前有写过一些<a href="http://www.islandcn.com/post/247.html">SQL Server查询优化方案整理</a>、<a href="http://www.islandcn.com/post/111.html">SQL触发器教程</a>以及<a href="http://www.islandcn.com/post/91.html">一些常用的行列转换等sql语句</a></p>
<p>今天再次整理下最近用到的SQL语句:指定表的字段名查询/索引的建立/增加字段/区间记录的SQL查询语句.</p>
<li>1.查询指定表中含有哪些字段?</li>
<pre name="code" class="sql">

select name from syscolumns where id in (select id from sysobjects where type = &#039;u&#039; and name = &#039;表名&#039;)  
</pre>
<li>建索引脚本:</li>
<pre name="code" class="sql">

create clustered index 索引名 on 表名(表.字段)
</pre>
<li>在表增加一个字段名为CName,数据类型为Int,不可为空,默认值是0的字段</li>
<pre name="code" class="sql">

alter table 表名 add CName int not null default 0
</pre>
<li>TOP 10是取前十个查询结果,现在需要取查询结果的区间数据 X至Y条数据的语句,例如选择前面第 X-Y条记录的sql语句如下：</li>
<pre name="code" class="sql">

--注意文中的testt为你的表名,另注意你的表中应该有一个自增字段 ID
declare @X int,@Y int,@M int,@N int	--X：起始位置  Y：终止位置
set @X=5	--初始化变量 开始
set @Y=10	--初始化变量 结束
set @M=@Y-@X+1
set @N=@X-1

--正序
execute (&#039;select top &#039;+ @M +&#039; * from testt
where id not in (select top &#039;+ @N +&#039; id from testt)&#039;)

--倒序
execute (&#039;select top &#039;+ @M +&#039; * from testt
where id not in (select top &#039;+ @N +&#039; id from testt order by id desc) order by id desc&#039;)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.islandcn.com/post/707.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
