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

<channel>
	<title>Just think it</title>
	<atom:link href="http://www.wenan8.com/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.wenan8.com/blog</link>
	<description>每天跑跑步有益身体健康哦！ ^_^</description>
	<lastBuildDate>Thu, 09 Sep 2010 01:44:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>CSS隐藏文字</title>
		<link>http://www.wenan8.com/blog/archives/321</link>
		<comments>http://www.wenan8.com/blog/archives/321#comments</comments>
		<pubDate>Thu, 09 Sep 2010 01:43:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB标准]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[隐藏文字]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=321</guid>
		<description><![CDATA[(1) text-indent:-9999px; 定义 text-indent 属性规定文本块中首行文本的缩进。 注释：允许使用负值。如果使用负值，那么首行会被缩进到左边。 注意：在 CSS 2.1 之前，text-indent 总是继承计算值，而不是声明值。 使用text-indent:-9999px; 可以偏移掉文本，但是这个属性只支持block块级元素，而我们想要偏移掉a上的文字时就不行了，当然，你也可以 a{display:block} 但是 a 后的元素就被换成下一行了,更当然，也可以继续转换,但是就有些&#8217;冗余&#8217;了。 (2) line-height:0; font-size:0; overflow:hidden; 能够很好的隐藏掉文字。 (3) display:none; 当然，这要给文字加个额外的标签了。]]></description>
			<content:encoded><![CDATA[<p>(1)<br />
text-indent:-9999px;<br />
定义<br />
text-indent 属性规定文本块中首行文本的缩进。<br />
注释：允许使用负值。如果使用负值，那么首行会被缩进到左边。<br />
注意：在 CSS 2.1 之前，text-indent 总是继承计算值，而不是声明值。<br />
使用text-indent:-9999px; 可以偏移掉文本，但是这个属性只支持block块级元素，而我们想要偏移掉a上的文字时就不行了，当然，你也可以<br />
a{display:block} 但是 a 后的元素就被换成下一行了,更当然，也可以继续转换,但是就有些&#8217;冗余&#8217;了。<br />
(2)<br />
line-height:0;<br />
font-size:0;<br />
overflow:hidden;<br />
能够很好的隐藏掉文字。<br />
(3)<br />
display:none;<br />
当然，这要给文字加个额外的标签了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/321/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP数组函数in_array与array_diff</title>
		<link>http://www.wenan8.com/blog/archives/317</link>
		<comments>http://www.wenan8.com/blog/archives/317#comments</comments>
		<pubDate>Tue, 27 Jul 2010 06:54:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[array_diff]]></category>
		<category><![CDATA[in_array]]></category>
		<category><![CDATA[数组]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=317</guid>
		<description><![CDATA[in_array &#8212; 检查数组中是否存在某个值 例子： 1 2 3 4 5 6 7 8 9 &#60;?php $os = array&#40;&#34;Mac&#34;, &#34;NT&#34;, &#34;Irix&#34;, &#34;Linux&#34;&#41;; if &#40;in_array&#40;&#34;Irix&#34;, $os&#41;&#41; &#123; echo &#34;Got Irix&#34;; &#125; if &#40;in_array&#40;&#34;mac&#34;, $os&#41;&#41; &#123; echo &#34;Got mac&#34;; &#125; ?&#62; array_diff() 返回一个数组，该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。 例子： 1 2 3 4 5 6 7 &#60;?php $array1 = array&#40;&#34;a&#34; =&#62; &#34;green&#34;, [...]]]></description>
			<content:encoded><![CDATA[<p>in_array &#8212; 检查数组中是否存在某个值<br />
例子：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$os</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Mac&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;NT&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Irix&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;Linux&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Irix&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$os</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Got Irix&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">in_array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;mac&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$os</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Got mac&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>array_diff() 返回一个数组，该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。<br />
例子：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$array1</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;a&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;green&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;red&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;blue&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;red&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$array2</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;b&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;green&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;yellow&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;red&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_diff</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #990000;">print_r</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>用处<br />
判断变量是否在数组中(  in_array )<br />
对不在其一数组中的键值进行操作:<br />
例:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$subArr</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'0'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'isTitle'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'1'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'isUrl'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'2'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'isIntro'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'3'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'isAuthor'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'4'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'isPub_Date'</span><span style="color: #339933;">,</span><span style="color: #0000ff;">'5'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'isPub_Time'</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$notSelect</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array_diff</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$subArr</span><span style="color: #339933;">,</span><span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">//取数组交集,判断没有选中的对象</span>
<span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$notSelect</span> <span style="color: #b1b100;">AS</span> <span style="color: #000088;">$key</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$queryNo</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #000088;">$val</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'=0'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #000088;">$queryNo</span><span style="color: #339933;">=</span><span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">','</span><span style="color: #339933;">,</span><span style="color: #000088;">$queryNo</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$queryNo</span><span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot; UPDATE ......   &quot;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/317/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[转]PHP程序61条面向对象分析设计的经验原则</title>
		<link>http://www.wenan8.com/blog/archives/315</link>
		<comments>http://www.wenan8.com/blog/archives/315#comments</comments>
		<pubDate>Wed, 14 Jul 2010 14:09:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[条面向对象]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=315</guid>
		<description><![CDATA[你不必严格遵守这些原则，违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃，若违背了其中的一条，那么警铃就会响起 。 &#8212;&#8211; Arthur J.Riel 　　(1)所有数据都应该隐藏在所在的类的内部。 　　(2)类的使用者必须依赖类的共有接口，但类不能依赖它的使用者。 　　(3)尽量减少类的协议中的消息。 　　(4)实现所有类都理解的最基本公有接口[例如，拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。 　　(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。 　　如果类的两个方法有一段公共代码，那么就可以创建一个防止这些公共代码的私有函数。 　　(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。 　　(7)类之间应该零耦合，或者只有导出耦合关系。也即，一个类要么同另一个类毫无关系，要么只使用另一个类的公有接口中的操作。 　　(8)类应该只表示一个关键抽象。 　　包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响，则将对包中的所有类产生影响，而对其他的包不造成任何影响 . 　　(9)把相关的数据和行为集中放置。 　　设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。 　　(10)把不相关的信息放在另一个类中(也即：互不沟通的行为)。 　　朝着稳定的方向进行依赖. 　　(11)确保你为之建模的抽象概念是类，而不只是对象扮演的角色。 　　(12)在水平方向上尽可能统一地分布系统功能，也即：按照设计，顶层类应当统一地共享工作。 　　(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。 　　规划一个接口而不是实现一个接口。 　　(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。 　　(15)对包含太多互不沟通的行为的类多加小心。 　　这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。 　　(16)在由同用户界面交互的面向对象模型构成的应用程序中，模型不应该依赖于界面，界面则应当依赖于模型。 　　(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。 　　(18)从你的设计中去除不需要的类。 　　一般来说，我们会把这个类降级成一个属性。 　　(19)去除系统外的类。 　　系统外的类的特点是，抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。 　　(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类，特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。 　　(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段，我们常会发现很多代理没有用的，应当去除。 　　(22)尽量减少类的协作者的数量。 　　一个类用到的其他类的数目应当尽量少。 　　(23)尽量减少类和协作者之间传递的消息的数量。 　　(24)尽量减少类和协作者之间的协作量，也即：减少类和协作者之间传递的不同消息的数量。 　　(25)尽量减少类的扇出，也即：减少类定义的消息数和发送的消息数的乘积。 　　(26)如果类包含另一个类的对象，那么包含类应当给被包含的对象发送消息。也即：包含关系总是意味着使用关系。 　　(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。 　　(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。 　　当类包含多于6个数据成员时，可以把逻辑相关的数据成员划分为一组，然后用一个新的包含类去包含这一组成员。 　　(29)让系统功能在窄而深的继承体系中垂直分布。 　　(30)在实现语义约束时，最好根据类定义来实现。这常常会导致类泛滥成灾，在这种情况下，约束应当在类的行为中实现，通常是在　　构造函数中实现，但不是必须如此。 　(31)在类的构造函数中实现语义约束时，把约束测试放在构造函数领域所允许的尽量深的包含层次中。 　　(32)约束所依赖的语义信息如果经常改变，那么最好放在一个集中式的第3方对象中。 　　(33)约束所依赖的语义信息如果很少改变，那么最好分布在约束所涉及的各个类中。 　　(34)类必须知道它包含什么，但是不能知道谁包含它。 　　(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。 　　(36)继承只应被用来为特化层次结构建模。 　　(37)派生类必须知道基类，基类不应该知道关于它们的派生类的任何信息。 　　(38)基类中的所有数据都应当是私有的，不要使用保护数据。 [...]]]></description>
			<content:encoded><![CDATA[<p>你不必严格遵守这些原则，违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃，若违背了其中的一条，那么警铃就会响起 。 &#8212;&#8211; Arthur J.Riel</p>
<p>　　(1)所有数据都应该隐藏在所在的类的内部。</p>
<p>　　(2)类的使用者必须依赖类的共有接口，但类不能依赖它的使用者。</p>
<p>　　(3)尽量减少类的协议中的消息。</p>
<p>　　(4)实现所有类都理解的最基本公有接口[例如，拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。</p>
<p>　　(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。</p>
<p>　　如果类的两个方法有一段公共代码，那么就可以创建一个防止这些公共代码的私有函数。</p>
<p>　　(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。</p>
<p>　　(7)类之间应该零耦合，或者只有导出耦合关系。也即，一个类要么同另一个类毫无关系，要么只使用另一个类的公有接口中的操作。</p>
<p>　　(8)类应该只表示一个关键抽象。</p>
<p>　　包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响，则将对包中的所有类产生影响，而对其他的包不造成任何影响 .</p>
<p>　　(9)把相关的数据和行为集中放置。</p>
<p>　　设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。</p>
<p>　　(10)把不相关的信息放在另一个类中(也即：互不沟通的行为)。</p>
<p>　　朝着稳定的方向进行依赖.<br />
<span id="more-315"></span></p>
<p>　　(11)确保你为之建模的抽象概念是类，而不只是对象扮演的角色。</p>
<p>　　(12)在水平方向上尽可能统一地分布系统功能，也即：按照设计，顶层类应当统一地共享工作。</p>
<p>　　(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。</p>
<p>　　规划一个接口而不是实现一个接口。</p>
<p>　　(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。</p>
<p>　　(15)对包含太多互不沟通的行为的类多加小心。</p>
<p>　　这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。</p>
<p>　　(16)在由同用户界面交互的面向对象模型构成的应用程序中，模型不应该依赖于界面，界面则应当依赖于模型。</p>
<p>　　(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。</p>
<p>　　(18)从你的设计中去除不需要的类。</p>
<p>　　一般来说，我们会把这个类降级成一个属性。</p>
<p>　　(19)去除系统外的类。</p>
<p>　　系统外的类的特点是，抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。</p>
<p>　　(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类，特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。</p>
<p>　　(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段，我们常会发现很多代理没有用的，应当去除。</p>
<p>　　(22)尽量减少类的协作者的数量。</p>
<p>　　一个类用到的其他类的数目应当尽量少。</p>
<p>　　(23)尽量减少类和协作者之间传递的消息的数量。</p>
<p>　　(24)尽量减少类和协作者之间的协作量，也即：减少类和协作者之间传递的不同消息的数量。</p>
<p>　　(25)尽量减少类的扇出，也即：减少类定义的消息数和发送的消息数的乘积。</p>
<p>　　(26)如果类包含另一个类的对象，那么包含类应当给被包含的对象发送消息。也即：包含关系总是意味着使用关系。</p>
<p>　　(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。</p>
<p>　　(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。</p>
<p>　　当类包含多于6个数据成员时，可以把逻辑相关的数据成员划分为一组，然后用一个新的包含类去包含这一组成员。</p>
<p>　　(29)让系统功能在窄而深的继承体系中垂直分布。</p>
<p>　　(30)在实现语义约束时，最好根据类定义来实现。这常常会导致类泛滥成灾，在这种情况下，约束应当在类的行为中实现，通常是在　　构造函数中实现，但不是必须如此。</p>
<p>　(31)在类的构造函数中实现语义约束时，把约束测试放在构造函数领域所允许的尽量深的包含层次中。</p>
<p>　　(32)约束所依赖的语义信息如果经常改变，那么最好放在一个集中式的第3方对象中。</p>
<p>　　(33)约束所依赖的语义信息如果很少改变，那么最好分布在约束所涉及的各个类中。</p>
<p>　　(34)类必须知道它包含什么，但是不能知道谁包含它。</p>
<p>　　(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。</p>
<p>　　(36)继承只应被用来为特化层次结构建模。</p>
<p>　　(37)派生类必须知道基类，基类不应该知道关于它们的派生类的任何信息。</p>
<p>　　(38)基类中的所有数据都应当是私有的，不要使用保护数据。</p>
<p>　　类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。</p>
<p>　　(39)在理论上，继承层次体系应当深一点，越深越好。</p>
<p>　　(40)在实践中，继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。</p>
<p>　　(41)所有的抽象类都应当是基类。</p>
<p>　　(42)所有的基类都应当是抽象类。</p>
<p>　　(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。</p>
<p>　　(44)如果两个或更多个类共享公共数据(但没有公共行为)，那么应当把公共数据放在一个类中，每个共享这个数据的类都包含这个类。</p>
<p>　　(45)如果两个或更多个类有共同的数据和行为(就是方法)，那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。<br />
　　(46)如果两个或更多个类共享公共接口(指的是消息，而不是方法)，那么只有他们需要被多态地使用时，他们才应当从一个公共基类　　继承。</p>
<p>　　(47)对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下，设计者应当使用多态。</p>
<p>　　(48)对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构，每个属性值都被变换成一个派生类。</p>
<p>　　(49)不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。</p>
<p>　　(50)不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。</p>
<p>　　(51)如果你觉得需要在运行时刻创建新的类，那么退后一步以认清你要创建的是对象。现在，把这些对象概括成一个类。</p>
<p>　　(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。</p>
<p>　　(53)不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。</p>
<p>　　(54)在创建继承层次时，试着创建可复用的框架，而不是可复用的组件。</p>
<p>　　(55)如果你在设计中使用了多重继承，先假设你犯了错误。如果没犯错误，你需要设法证明。</p>
<p>　　(56)只要在面向对象设计中用到了继承，问自己两个问题：(1)派生类是否是它继承的那个东西的一个特殊类型?(2)基类是不是派生类的一部分?</p>
<p>　　(57)如果你在一个面向对象设计中发现了多重继承关系，确保没有哪个基类实际上是另一个基类的派生类。</p>
<p>　　(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择，请选择包含关系。</p>
<p>　　(59)不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。</p>
<p>　　(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是，在对逻辑设计作出决策的过程中我们经常用到物理设计准则。</p>
<p>　　(61)不要绕开公共接口去修改对象的状态。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/315/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Memcached在大型网站中应用</title>
		<link>http://www.wenan8.com/blog/archives/313</link>
		<comments>http://www.wenan8.com/blog/archives/313#comments</comments>
		<pubDate>Sun, 11 Jul 2010 13:31:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Memcached]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=313</guid>
		<description><![CDATA[原文链接：http://tomore.myoow.com/showlog351.html =================================================== memcached是一个高性能的分布式的内存对象缓存系统，通过在内存里维护一个统一的巨大的hash表，它能够用来存储各种格式的数据，包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用，为了减轻数据库检索的压力，来做的这个缓存系统。它的缓存是一种分布式的，也就是可以允许不同主机上的多个用户同时访问这个缓存系统， 这种方法不仅解决了共享内存只能是单机的弊端， 同时也解决了数据库检索的压力，最大的优点是提高了访问获取数据的速度！基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库， 分布式计算等领域。 1、 memcached 协议理解 memcache是为了加快http://www.livejournal.com/访问速度而诞生的一个项目。 它的官方主页是：http://www.danga.com/memcached/ 目前在网站开发中应用较少，主要的应用有： http://www.danga.com/memcached/users.bml 在国内的网站开发中，还很少没见到有应用的，中文资料十分匮乏。 工作机制：通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度，和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash，用户不必关心数据存放在哪，只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。 2、 memcached 使用入门 2.1 memcached的安装 ?memcached服务的安装 先检查linux内核版本，建议将memcached 安装在2.6以上。 因为memcached 需要用到libevent和 epoll 。 memcached安装前首先确定你的服务器上面安装了libevent库， libevent下载地址（ http://www.monkey.org/~provos/libevent/）。 下载memcached的源码（ http://www.danga.com/memcached/download.bml）。 Memcached最初是用perl写的，现在的版本是用c写的。 下载后拷贝到一个目录，安装需要root用户来执行 tar -zxvf memcached-1.1.12.tar.gz cd memcached-1.1.12 ./configure 这里必须先要configure, 它会检测你的系统情况，然后生成一个config.h文件和其它的几个文件，另外和其它的configure一样，你可以配置它的安装路径等等。默认应用程序安装在/usr/local/bin目录下。 make //编译 make install //安装 memcached客户端的安装 根据memcached协议，用户可以自己写出符合自己要求的客户端程序。目前http://www.danga.com/memcached/download.bml 提供perl,c,java,python,php等客户端程序供下载和参考。下面我就以perl客户端程序为例说明客户端的安装： 下载后拷贝到一个目录，安装需要root用户来执行 tar [...]]]></description>
			<content:encoded><![CDATA[<p>原文链接：http://tomore.myoow.com/showlog351.html<br />
===================================================<br />
memcached是一个高性能的分布式的内存对象缓存系统，通过在内存里维护一个统一的巨大的hash表，它能够用来存储各种格式的数据，包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用，为了减轻数据库检索的压力，来做的这个缓存系统。它的缓存是一种分布式的，也就是可以允许不同主机上的多个用户同时访问这个缓存系统， 这种方法不仅解决了共享内存只能是单机的弊端， 同时也解决了数据库检索的压力，最大的优点是提高了访问获取数据的速度！基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库， 分布式计算等领域。<br />
<span id="more-313"></span><br />
1、 memcached 协议理解<br />
memcache是为了加快http://www.livejournal.com/访问速度而诞生的一个项目。<br />
它的官方主页是：http://www.danga.com/memcached/<br />
目前在网站开发中应用较少，主要的应用有： </p>
<p>http://www.danga.com/memcached/users.bml</p>
<p>在国内的网站开发中，还很少没见到有应用的，中文资料十分匮乏。<br />
工作机制：通过在内存中开辟一块区域来维持一个大的hash表来加快页面访问速度，和数据库是独立的。但是目前主要用来缓存数据库的数据。允许多个server通过网络形成一个大的hash，用户不必关心数据存放在哪，只调用相关接口就可。存放在内存的数据通过LRU算法进行淘汰出内存。同时可以通过删除和设置失效时间来淘汰存放在内存的数据。<br />
2、 memcached 使用入门<br />
2.1 memcached的安装<br />
?<1>memcached服务的安装<br />
先检查linux内核版本，建议将memcached 安装在2.6以上。<br />
因为memcached 需要用到libevent和 epoll 。<br />
memcached安装前首先确定你的服务器上面安装了libevent库，<br />
libevent下载地址（ http://www.monkey.org/~provos/libevent/）。<br />
下载memcached的源码（ http://www.danga.com/memcached/download.bml）。<br />
Memcached最初是用perl写的，现在的版本是用c写的。<br />
下载后拷贝到一个目录，安装需要root用户来执行<br />
tar -zxvf memcached-1.1.12.tar.gz<br />
cd memcached-1.1.12<br />
./configure<br />
这里必须先要configure, 它会检测你的系统情况，然后生成一个config.h文件和其它的几个文件，另外和其它的configure一样，你可以配置它的安装路径等等。默认应用程序安装在/usr/local/bin目录下。<br />
make //编译<br />
make install //安装<br />
<2>memcached客户端的安装<br />
根据memcached协议，用户可以自己写出符合自己要求的客户端程序。目前http://www.danga.com/memcached/download.bml<br />
提供perl,c,java,python,php等客户端程序供下载和参考。下面我就以perl客户端程序为例说明客户端的安装：<br />
下载后拷贝到一个目录，安装需要root用户来执行<br />
tar -zxvf Cache-Memcached-1.14.tar.gz<br />
cd Cache-Memcached-1.14<br />
perl makefile.pl<br />
make<br />
make install<br />
make test<br />
这样就安装好了memcahced， 启动memcached就可使用分布式缓存系统了！<br />
2.2 快速入门<br />
<1> memcached服务的启动<br />
memcached的启动非常简单，它没有配置文件，只要配置好几个参数就可以使用了。下面我以一个实际应用的例子，具体说明一下：<br />
memcached –d –m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log<br />
启动的这个memcached为一个后台守护进程模式（-d), 然后缓存的空间为500M（-m), 监听(-l)服务器64.128.191.15的11211号端口(-p).,将日志写道/var/www/kelly/test/logs/memcached_$$.log(-vv)。<br />
其实memcached的参数也非常的有限,就下面这几个：<br />
? -p port number to listen on<br />
? -l interface to listen on, default is INDRR_ANY<br />
? -d run as a daemon<br />
? -r maximize core file limit<br />
? -u assume identity of (only when run as root)<br />
? -m max memory to use for items in megabytes, default is 64 MB<br />
? -M return error on memory exhausted (rather than removing items)<br />
? -c max simultaneous connections, default is 1024<br />
? -k lock down all paged memory<br />
? -v verbose (print errors/warnings while in event loop)<br />
? -vv very verbose (also print client commands/reponses)<br />
? -h print this help and exit<br />
? -i print memcached and libevent license<br />
我们也可以将这个启动脚本写道/etc/rc.d或者/erc/rc.local，这样可以在服务器启动时候执行。<br />
<2> memcached客户端的连接<br />
下面我就以perl客户端程序为例说明客户端的连接:<br />
启动两个memcached server<br />
memcached –d –m 500 -l 64.128.191.151 -p 11211 -vv >>/var/www/kelly/test/logs/memcached_$$.log<br />
memcached –d –m 500 -l 64.128.191.151 -p 11212 -vv >>/var/www/kelly/test/logs/memcached_$$.log<br />
perl客户端程序<br />
#!/usr/bin/perl<br />
use Cache::Memcached;<br />
my $memd = new Cache::Memcached {<br />
&#8216;servers&#8217; => [ "64.128.191.15:11211" , "64.128.191.15:11212"],<br />
};<br />
my $val = $memd->get( &#8220;my_key&#8221; );<br />
if ( $val )<br />
{<br />
print &#8220;Value is &#8216;$val&#8217;\n&#8221;;<br />
}<br />
# Set a value<br />
$memd->set(&#8220;my_key&#8221;, &#8220;123&#8243;);<br />
$memd->disconnect_all();<br />
?运行测试<br />
$ perl test-memcache.pl<br />
$ perl test-memcache.pl<br />
Value is &#8217;123&#8242;<br />
可以看到，第一次没有取得my_key，第二次从memcached中得到my_key的值。<br />
同时通过查看日志，可以发现的确存储在两个memcache server中。<br />
这个简单的例子，解释了如何在memcached中存取数据，以及memcache是真正的分布式缓存系统。<br />
当然，这还只是很简单的例子，体现不出memcache的优势，下面将通过一个很具体的例子，给出详细的应用。<br />
3、 memcached在Zorpia的应用<br />
http://www.zorpia.com 是一个网页相册，博客，交友，论坛的大型网站公司。现在已有超过140万活跃使用者遍布美国，香港，东南亚，欧洲，澳洲，亚洲等其它地区。每天的访问量都在增长，已成为全世界排名第五的社会生活关系网。<br />
Memcached也采用了memcached来提高网站的访问速度，并且取得了很好的效果，我在负责zorpia的memcached项目时候积累了一些经验，主要的做法如下：<br />
1） 通过对memcache的perl客户端进行包装，定制自己的客户端。<br />
2） 通过制定符合zorpia规范的hash key命名规范<br />
? ? memcache中需要存储的内容的key均由string组成。<br />
这个string统一由一个memcache.pm的subroutine来实现。(假设这个subroutine是 get_key() )<br />
? ? memcache中存放两种形式的数据<br />
(1) result of SQL query :<br />
(2) 普通变量(variable)<br />
这两种数据的key的组合方式是不相同的，由get_key进行判断和完成<br />
? ? 关于get_key 和 naming rule<br />
get_key subroutine完成所有memcache key的命名，naming rule也是在它里边体现：<br />
(1)输入参数 －－ hash结构，里边定义了当前需要存放的数据的信息<br />
结构<br />
(2)返回值 －－ string，返回数据的key_name<br />
?必须确定 get_key 的传入hash的结构，<br />
hash中主要有两个元素<br />
type &#8212; 定义当前数据结构的类型 ，有 &#8216;var&#8217; , &#8216;sql&#8217;两种值<br />
object &#8212; 存放当前数据结构的详细信息，<br />
当 type eq &#8216;var&#8217;时，object表示变量的名字，该名字由程序员指定<br />
当 type eq &#8216;sql&#8217;时，object包含所存放sql的主要基本信息，hash结构，也由程序员按照规则制定<br />
## 当variable 数据类型，比较简单<br />
$var_hash = {<br />
type => &#8216;var&#8217;, ## var表示当前类型是 variable<br />
object => &#8216;language&#8217;, ## language代表variable的名字<br />
};<br />
生成的key是Zorpia::var| language<br />
## sql 数据<br />
比如select first_name from user where user_id =2那么hash为<br />
$sql_hash = {<br />
type => &#8216;sql&#8217;,<br />
object => {<br />
table => {table2=>&#8221;user&#8221;,}, ## sql 查询的表<br />
column => {column1=>&#8221;first_name&#8221;,}, ## sql所要查询的column<br />
condition => { user_id =>&#8221;2&#8243;,}, ## sql条件<br />
},<br />
};<br />
生成的key是Zorpia::sql|user|first_name| user_id =2<br />
get_key subroutine必须对传入hash进行判断，对不同类型的数据按照不同的方式组合，形成key，返回给使用者。这个key，必须保证其唯一性：<br />
比如：所有字母小写，一些数组在组合成key之前必须首先排序<br />
? ? get_key函数<br />
sub get_key{<br />
my $hash = shift;<br />
return undef unless $hash &#038;&#038; ref $hash eq &#8220;HASH&#8221;;<br />
my $type = $hash->{type};<br />
my $key_name;<br />
if ($type eq &#8216;sql&#8217;) {<br />
my ($table_key,$column_key,$condition_key);<br />
$table_key=_get_key($hash->{object}->{table});<br />
$column_key=_get_key($hash->{object}->{column});<br />
$condition_key=_get_key($hash->{object}->{condition});<br />
$key_name = join(&#8216;|&#8217;,$type,$table_key,$column_key,$condition_key);<br />
#Currently the length limit of a key is set at 250 characters<br />
if (length($key_name)>250)<br />
{<br />
$key_name=substr(0,250,$key_name);<br />
}<br />
}<br />
elsif($type eq &#8216;var&#8217;)<br />
{<br />
$key_name = join(&#8216;|&#8217;,$type,$hash->{object});<br />
}<br />
return $key_name;<br />
}<br />
sub _get_key<br />
{<br />
my $hash=shift;<br />
return undef unless $hash &#038;&#038; ref $hash eq &#8220;HASH&#8221;;<br />
my ($t,$ret,$i);<br />
foreach $i (sort keys %$hash)<br />
{<br />
$i=~s/^\s+|\s+$//g;<br />
$hash->{$i}=~s/^\s+|\s+$//g;<br />
push(@$t,lc(&#8220;$i=$hash->{$i}&#8221;));<br />
}<br />
$ret=join(&#8216;:&#8217;,sort { $a cmp $b } @$t);<br />
return $ret;<br />
}<br />
3） 制定需要应用memcached的规则<br />
?经常访问的表user,user_details<br />
?合理设定变量在memcached的生存周期<br />
?将活跃用户的信息预先导入到memcached<br />
?分别在多台机器上启动多个memcached服务<br />
?编写脚本监控memcached服务是否活动<br />
4） User表的具体应用举例<br />
? 在 select时候<br />
先查询memcahce里有没有，有的话，返回；否则从数据库select,在memcache里设置，返回。<br />
my $sql_hash = {<br />
type => &#8216;sql&#8217;,<br />
object => {<br />
table => {table1=>&#8221;user&#8221;,},<br />
column => {column1=>&#8221;user_id&#8221;,},<br />
condition => {email=>$user_id,},<br />
},<br />
};<br />
my $key=Zorpia::MemCache::get_key($sql_hash);<br />
my $user_id_by_email=Zorpia::MemCache::get($key);<br />
if(!$user_id_by_email)<br />
{<br />
my $sth;<br />
my $query =&#8221;select user_id from user where email=?&#8221;;<br />
$sth = $dbh->prepare($query);<br />
$sth->execute($user_id);<br />
my $user1 = $sth->fetchrow_hashref();<br />
$user_id_by_email=$user1->{&#8216;user_id&#8217;};<br />
Zorpia::MemCache::set($key,$user_id_by_email,1800);<br />
}<br />
?在 update,insert,delete时候<br />
先在数据库update,insert,delete,在memcache里设置，返回。<br />
&#038;Zorpia::DB::data_entry_no_return($dbh,&#8221;user&#8221;,&#8221;COUNT(*)&#8221;,&#8221;$account_information_insert_statement user_id=$current_user_id&#8221;, &#8220;user_id=$current_user_id&#8221;);<br />
#add by kelly<br />
my $sql_hash = {<br />
type => &#8216;sql&#8217;,<br />
object => {<br />
table => {table1=>&#8221;user&#8221;,},<br />
column => {column1=>&#8221;user_id&#8221;,},<br />
condition => {user_id=>$current_user_id,},<br />
},<br />
};<br />
my $key=Zorpia::MemCache::get_key($sql_hash);<br />
my $query = &#8220;SELECT *, user_id AS id FROM user WHERE user_id=?&#8221;;<br />
my $sth_memc = $dbh->prepare($query);<br />
$sth_memc->execute($current_user_id);<br />
my $user_memc = $sth_memc->fetchrow_hashref();<br />
&#038;Zorpia::MemCache::set($key,$user_memc,21600);<br />
4、 memcached的应用展望<br />
使用了memcached以后， 我发现以前做过的很多的项目都可以应用它提高效率，包括最近做的“大单追踪”， “数码搜索”等等。当然既然memcahced是分布式的缓存系统，那么它就是建立了一个分布式的平台， 我们可以用它来进行分布式的记数， 因为对于一个键值key我们可以设置它的数值以及有效期在参数中，另外还可以重新设置这个键值的数值。 所以我总结了一下目前可以应用到的地方：<br />
<1>.数据库检索结果的缓存，也就是说可以有机的和数据库结合起来应用，提高效率。<br />
这也是目前memcached用到的最多的地方，比如用于大型网站等。<br />
可以这样来实现：<br />
打开memcached服务器连接<br />
编写sql语句， 同时算出它的一个hash key值<br />
获取这个hash值的memcached保存数据(get)<br />
如果获取的这个hash值的数据存在。返回<br />
否则连接数据库查找<br />
把这个查找结果保存在memcached中(set)，可以设置有效期<br />
返回查找结果<br />
<2>.分布式计算<br />
<3>.分布式共享数据<br />
总之，memcached的机制比较灵活，可以适用于一切需要分布式缓存数据的地方，随着memcached逐渐为人所知，必将在更多的分布式应用领域大放异彩。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/313/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高效整洁CSS代码原则 [转]</title>
		<link>http://www.wenan8.com/blog/archives/308</link>
		<comments>http://www.wenan8.com/blog/archives/308#comments</comments>
		<pubDate>Mon, 05 Jul 2010 01:46:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB标准]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[高效]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=308</guid>
		<description><![CDATA[CSS学起来并不难，但在大型项目中，就变得难以管理，特别是不同的人在CSS书写风格上稍有不同，团队上就更加难以沟通，为此总结了一些如何实现高效整洁的CSS代码原则： 1. 使用Reset但并非全局Reset 　　不同浏览器元素的默认属性有所不同，使用Reset可重置浏览器元素的一些默认属性，以达到浏览器的兼容。但需要注意的是，请不要使用全局Reset： view sourceprint?*{ margin:0; padding:0; } 　　这不仅仅因为它是缓慢和低效率的方法，而且还会导致一些不必要的元素也重置了外边距和内边距。在此建议参考YUI Reset和Eric Meyer的做法。我跟Eric Meyer的观点相同，Reset并不是一成不变的，具体还需要根据项目的不同需求做适当的修改，以达到浏览器的兼容和操作上的便利性。我使用的Reset如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 &#60;p&#62;view sourceprint?/** 清除内外边距 **/&#60;/p&#62; &#60;p&#62;body, h1, h2, h3, h4, h5, h6, hr, p,&#60;/p&#62; &#60;p&#62;blockquote, /* [...]]]></description>
			<content:encoded><![CDATA[<p>CSS学起来并不难，但在大型项目中，就变得难以管理，特别是不同的人在CSS书写风格上稍有不同，团队上就更加难以沟通，为此总结了一些如何实现高效整洁的CSS代码原则：<br />
<span style="color: #000000;"><strong>1. 使用Reset但并非全局Reset</strong><br />
</span>　　不同浏览器元素的默认属性有所不同，使用Reset可重置浏览器元素的一些默认属性，以达到浏览器的兼容。但需要注意的是，请不要使用全局Reset：<br />
view sourceprint?*{ margin:0; padding:0; }</p>
<p>　　这不仅仅因为它是缓慢和低效率的方法，而且还会导致一些不必要的元素也重置了外边距和内边距。在此建议参考YUI Reset和Eric Meyer的做法。我跟Eric Meyer的观点相同，Reset并不是一成不变的，具体还需要根据项目的不同需求做适当的修改，以达到浏览器的兼容和操作上的便利性。我使用的Reset如下:</p>
<p><span id="more-308"></span></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;p&gt;view sourceprint?/** 清除内外边距 **/&lt;/p&gt;
&lt;p&gt;body, h1, h2, h3, h4, h5, h6, hr, p,&lt;/p&gt;
&lt;p&gt;blockquote, /* structural elements 结构元素 */&lt;/p&gt;
&lt;p&gt;dl, dt, dd, ul, ol, li, /* list elements 列表元素 */&lt;/p&gt;
&lt;p&gt;pre, /* text formatting elements 文本格式元素 */&lt;/p&gt;
&lt;p&gt;form, fieldset, legend, button, input, textarea, /* form elements 表单元素 */&lt;/p&gt;
&lt;p&gt;th, td, /* table elements 表格元素 */&lt;/p&gt;
&lt;p&gt;img/* img elements 图片元素 */{&lt;/p&gt;
&lt;p&gt;border:medium none;&lt;/p&gt;
&lt;p&gt;margin: 0;&lt;/p&gt;
&lt;p&gt;padding: 0;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;/** 设置默认字体 **/&lt;/p&gt;
&lt;p&gt;body,button, input, select, textarea {&lt;/p&gt;
&lt;p&gt;font: 12px/1.5 '宋体',tahoma, Srial, helvetica, sans-serif;&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;h1, h2, h3, h4, h5, h6 { font-size: 100%; }&lt;/p&gt;
&lt;p&gt;em{font-style:normal;}&lt;/p&gt;
&lt;p&gt;/** 重置列表元素 **/&lt;/p&gt;
&lt;p&gt;ul, ol { list-style: none; }&lt;/p&gt;
&lt;p&gt;/** 重置超链接元素 **/&lt;/p&gt;
&lt;p&gt;a { text-decoration: none; color:#333;}&lt;/p&gt;
&lt;p&gt;a:hover { text-decoration: underline; color:#F40; }&lt;/p&gt;
&lt;p&gt;/** 重置图片元素 **/&lt;/p&gt;
&lt;p&gt;img{ border:0px;}&lt;/p&gt;
&lt;p&gt;/** 重置表格元素 **/&lt;/p&gt;
&lt;p&gt;table { border-collapse: collapse; border-spacing: 0; }&lt;/p&gt;</pre></td></tr></table></div>

<p><strong>2. 良好的命名习惯</strong></p>
<p>　　无疑乱七八糟或者无语义命名的代码，谁看了都会抓狂。就像这样的代码：</p>
<p>view sourceprint?.aaabb{margin:2px;color:red;}</p>
<p>　　我想即使是初学者，也不至于会在实际项目中如此命名一个class，但有没有想过这样的代码同样是很有问题的：</p>
<p>view sourceprint?</p>
<h1>My name is <span class="red blod">Wiky</span></h1>
<p>　　问题在于如果你需要把所有原本红色的字体改成蓝色，那修改后就样式就会变成：</p>
<p>view sourceprint?.red{color:bule;}</p>
<p>　　这样的命名就会很让人费解，同样的命名为.leftBar的侧边栏如果需要修改成右侧边栏也会很麻烦。所以，请不要使用元素的特性（颜色，位置，大小等）来命名一个class或id，您可以选择意义的命名如：#navigation{&#8230;}，.sidebar{&#8230;}，.postwrap{&#8230;}</p>
<p>　　这样，无论你如何修改定义这些class或id的样式，都不影响它跟HTML元素间的联系。</p>
<p>　　另外还有一种情况，一些固定的样式，定义后就不会修改的了，那你命名时就不用担忧刚刚说的那种情况，如</p>
<p>view sourceprint?.alignleft{float:left;margin-right:20px;}</p>
<p>.alignright{float:right;text-align:right;margin-left:20px;}</p>
<p>.clear{clear:both;text-indent:-9999px;}</p>
<p>　　那么对于这样一个段落</p>
<p>view sourceprint?</p>
<p class="alignleft">我是一个段落！</p>
<p>　　如果需要把这个段落由原先的左对齐修改为右对齐，那么只需要修改它的className就为alignright就可以了。</p>
<p><strong>3. 代码缩写</strong></p>
<p>　　CSS代码缩写可以提高你写代码的速度，精简你的代码量。在CSS里面有不少可以缩写的属性，包括margin，padding，border，font，background和颜色值等，如果您学会了代码缩写，原本这样的代码：</p>
<p>view sourceprint?li{</p>
<p>font-family:Arial, Helvetica, sans-serif;</p>
<p>font-size: 1.2em;</p>
<p>line-height: 1.4em;</p>
<p>padding-top:5px;</p>
<p>padding-bottom:10px;</p>
<p>padding-left:5px;</p>
<p>}</p>
<p>就可以缩写为：</p>
<p>view sourceprint?li{</p>
<p>font: 1.2em/1.4em Arial, Helvetica, sans-serif;</p>
<p>padding:5px 0 10px 5px;</p>
<p>}</p>
<p>　　如果您想更了解这些属性要怎么缩写，可以参考《常用CSS缩写语法总结》或者下载CSS-Shorthand-Cheat-Sheet.pdf 。</p>
<p><strong>4. 利用CSS继承</strong></p>
<p>　　如果页面中父元素的多个子元素使用相同的样式，那最好把他们相同的样式定义在其父元素上，让它们继承这些CSS样式。这样你可以很好的维护你的代码，并且还可以减少代码量。那么本来这样的代码：</p>
<p>view sourceprint?#container li{ font-family:Georgia, serif; }</p>
<p>#container p{ font-family:Georgia, serif; }</p>
<p>#container h1{font-family:Georgia, serif; }</p>
<p>就可以简写成：</p>
<p>view sourceprint?#container{ font-family:Georgia, serif; }</p>
<p><strong>5. 使用多重选择器</strong></p>
<p>　　你可以合并多个CSS选择器为一个，如果他们有共同的样式的话。这样做不但代码简洁且可为你节省时间和空间。如：</p>
<p>view sourceprint?h1{ font-family:Arial, Helvetica, sans-serif; font-weight:normal; }</p>
<p>h2{ font-family:Arial, Helvetica, sans-serif; font-weight:normal; }</p>
<p>h3{ font-family:Arial, Helvetica, sans-serif; font-weight:normal; }</p>
<p>可以合并为</p>
<p>view sourceprint?h1, h2, h3{ font-family:Arial, Helvetica, sans-serif; font-weight:normal; }</p>
<p><strong>6. 适当的代码注释</strong></p>
<p>代码注释可以让别人更容易读懂你的代码，且合理的组织代码注释，可使得结构更加清晰。你可以选择做的样式表的开始添加目录:</p>
<p>view sourceprint?/*&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>1. Reset</p>
<p>2. Header</p>
<p>3. Content</p>
<p>4. SideBar</p>
<p>5. Footer</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; */</p>
<p>　　如此你代码的结构就一目了然，你可以容易的查找和修改代码。</p>
<p>　　而对于代码的主内容，也应适当的加以划分，甚至在有必要的地方在对代码加以注释说明，这样也有利于团队开发:</p>
<p>view sourceprint?/*** Header ***/</p>
<p>#header{ height:145px; position:relative; }</p>
<p>#header h1{ width:324px; margin:45px 0 0 20px; float:left; height:72px;}</p>
<p>/*** Content ***/</p>
<p>#content{ background:#fff; width:650px; float:left; min-height:600px; overflow:hidden;}</p>
<p>#content h1{color:#F00}/* 设置字体颜色 */</p>
<p>#content .posts{ overflow:hidden; }</p>
<p>#content .recent{ margin-bottom:20px; border-bottom:1px solid #f3f3f3; position:relative; overflow:hidden; }</p>
<p>/*** Footer ***/</p>
<p>#footer{ clear:both; padding:50px 5px 0; overflow:hidden;}</p>
<p>#footer h4{ color:#b99d7f; font-family:Arial, Helvetica, sans-serif; font-size:1.1em; }</p>
<p><strong>7. 给你的CSS代码排序</strong></p>
<p>如果代码中的属性都能按照字母排序，那查找修改的时候就能更加快速:</p>
<p>view sourceprint?/*** 样式属性按字母排序 ***/</p>
<p>div{</p>
<p>background-color:#3399cc;</p>
<p>color:#666;</p>
<p>font:1.2em/1.4em Arial, Helvetica, sans-serif;</p>
<p>height:300px;</p>
<p>margin:10px 5px;</p>
<p>padding:5px 0 10px 5px;</p>
<p>width:30%;</p>
<p>z-index:10;</p>
<p>}</p>
<p><strong>8. 保持CSS的可读性</strong></p>
<p>　　书写可读的CSS将会使得更容易查找和修改样式。对于以下两种情况，哪种可读性更高，我想不言而明。</p>
<p>view sourceprint?/*** 每个样式属性写一行 ***/</p>
<p>div{</p>
<p>background-color:#3399cc;</p>
<p>color:#666;</p>
<p>font: 1.2em/1.4em Arial, Helvetica, sans-serif;</p>
<p>height:300px;</p>
<p>margin:10px 5px;</p>
<p>padding:5px 0 10px 5px;</p>
<p>width:30%;</p>
<p>z-index:10;</p>
<p>}</p>
<p>/*** 所有的样式属性写在同一行 ***/</p>
<p>div{ background-color:#3399cc; color:#666; font: 1.2em/1.4em Arial, Helvetica, sans-serif; height:300px; margin:10px 5px; padding:5px 0 10px 5px; width:30%; z-index:10; }</p>
<p>当对于一些样式属性较少的选择器，我会写到一行：</p>
<p>view sourceprint?/*** 选择器属性少的写在同一行 ***/</p>
<p>div{ background-color:#3399cc; color:#666;}</p>
<p>对于这个规则并非硬性规定，但无论您采用哪种写法，我的建议是始终保持代码一致。属性多的分行写，属性少于3个可以写一行。</p>
<p><strong>9. 选择更优的样式属性值</strong></p>
<p>　　CSS中有些属性采用不同的属性值，虽然达到的效果差不多，当性能上却存在着差异，如</p>
<p>　　区别在于border:0把border设为0px，虽然在页面上看不见，但按border默认值理解，浏览器依然对border-width/border-color进行了渲染，即已经占用了内存值。<br />
　　而border:none把border设为“none”即没有，浏览器解析“none”时将不作出渲染动作，即不会消耗内存值。所以建议使用border:none;</p>
<p>　　同样的，display:none隐藏对象浏览器不作渲染，不占用内存。而visibility:hidden则会。</p>
<p><strong>10. 使用&lt;link&gt;代替@import</strong></p>
<p>首先，@import不属于XHTML标签，也不是Web标准的一部分，它对于较早期的浏览器兼容也不高，并且对于网站的性能有某些负面的影响。具体可以参考《高性能网站设计：不要使用@import》。所以，请避免使用@import</p>
<p><strong>11. 使用外部样式表</strong></p>
<p>　　这个原则始终是一个很好的设计实践。不单可以更易于维护修改，更重要的是使用外部文件可以提高页面速度，因为CSS文件都能在浏览器中产生缓存。内置在HTML文档中的CSS则会在每次请求中随HTML文档重新下载。所以，在实际应用中，没有必要把CSS代码内置在HTML文档中：</p>
<p>view sourceprint?<!--</p>
<p>#container{ .. }</p>
<p>#sidebar{ .. }</p>
<p>&#8211;></p>
<p>或</p>
<li style="font-family:Arial, helvetica, sans-serif; color:#666; ">而是使用<br />
导入外部样式表：</p>
<p>view sourceprint?</p>
<p><strong>12. 避免使用CSS表达式（Expression）</strong></p>
<p>　　CSS表达式是动态设置CSS属性的强大（但危险）方法。Internet Explorer从第5个版本开始支持CSS表达式。下面的例子中，使用CSS表达式可以实现隔一个小时切换一次背景颜色：</p>
<p>view sourceprint?background-color: expression( (new Date()).getHours()%2 ? &#8220;#B8D4FF&#8221; : &#8220;#F08A00&#8243; );</p>
<p>　　如上所示，expression中使用了JavaScript表达式。CSS属性根据JavaScript表达式的计算结果来设置。</p>
<p>　　表达式的问题就在于它的计算频率要比我们想象的多。不仅仅是在页面显示和缩放时，就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给CSS表达式增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到10000次以上的计算量。</p>
<p>　　如果必须使用CSS表达式，一定要记住它们要计算成千上万次并且可能会对你页面的性能产生影响。所以，在非不得已，请避免使用CSS表达式。</p>
<p><strong>13. 代码压缩</strong></p>
<p>　　当你决定把网站项目部署到网络上，那你就要考虑对CSS进行压缩，出去注释和空格，以使得网页加载得更快。压缩您的代码，可以采用一些工具，如YUI Compressor</p>
<p>利用它可精简CSS代码，减少文件大小，以获得更高的加载速度。</p>
<p><strong>14. 总结</strong></p>
<p>　　在本文中，我力图更详尽的总结书写更高效的CSS代码的原则，但鉴于本人见识和精力有限，我还是希望这些原则能帮助您更好的书写和管理您的CSS代码，不知您又是如何书写CSS的，是否也有一些想要分享的技巧？给我留言吧谢谢~</p>
<p>原文地址：http://www.cnblogs.com/wiky/articles/better-css-code.html</li>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/308/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XP+Ubuntu双系统重新安装GRUB</title>
		<link>http://www.wenan8.com/blog/archives/304</link>
		<comments>http://www.wenan8.com/blog/archives/304#comments</comments>
		<pubDate>Fri, 02 Jul 2010 02:54:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[网络资源]]></category>
		<category><![CDATA[GRUB]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=304</guid>
		<description><![CDATA[前几天打雷把电脑给&#8221;震惊&#8221;了。 一个响雷,电脑直接蓝屏,按重启后，电脑进不去系统，由于我装的是XP+Ubuntu8.10双系统, 进去后都没有引导选项，出现 grub error 15 xx错误， 直接泪崩,下午还要进行试答辩,现在进不去系统，着急的不行。 慢慢安静下来分析了下。 不能进入安全模式(自检到23%就死机) 硬件没问题，就是进入不了系统。 好,应该是引导项文件损坏了。重新装一下: 1.找来ubuntu的Live CD. 2.试用Ubuntu而不改变计算机中的任何内容 3.打开终端,用超级用户登录 4.输入&#8221;grub&#8221;，会出现GRUB命令提示。 5.输入&#8221;find /boot/grub/stage1&#8243;。（或者 find /grub/stage1 视情况而定）会出现如同&#8221;(hd0)&#8221;样的结果，在我的电脑上是&#8221;(hd0,7)&#8221;。在下面的命令中使用您电脑中得到的结果。 6.输入&#8221;root (hd0,7)&#8221;。 7.输入&#8221;setup (hd0,7)&#8221;。 8.退出,重启。 OK 终于看到了熟悉的 Grub,鸡动.]]></description>
			<content:encoded><![CDATA[<p>前几天打雷把电脑给&#8221;震惊&#8221;了。<br />
一个响雷,电脑直接蓝屏,按重启后，电脑进不去系统，由于我装的是XP+Ubuntu8.10双系统, 进去后都没有引导选项，出现 grub error 15 xx错误， 直接泪崩,下午还要进行试答辩,现在进不去系统，着急的不行。<br />
慢慢安静下来分析了下。<br />
不能进入安全模式(自检到23%就死机)<br />
硬件没问题，就是进入不了系统。<br />
好,应该是引导项文件损坏了。重新装一下:<br />
1.找来ubuntu的Live CD.<br />
2.试用Ubuntu而不改变计算机中的任何内容<br />
3.打开终端,用超级用户登录<br />
4.输入&#8221;grub&#8221;，会出现GRUB命令提示。<br />
5.输入&#8221;find   /boot/grub/stage1&#8243;。（或者 find   /grub/stage1  视情况而定）会出现如同&#8221;(hd0)&#8221;样的结果，在我的电脑上是&#8221;(hd0,7)&#8221;。在下面的命令中使用您电脑中得到的结果。<br />
6.输入&#8221;root (hd0,7)&#8221;。<br />
7.输入&#8221;setup (hd0,7)&#8221;。<br />
8.退出,重启。 OK<br />
终于看到了熟悉的 Grub,鸡动.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/304/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>毕业设计顺利完成</title>
		<link>http://www.wenan8.com/blog/archives/301</link>
		<comments>http://www.wenan8.com/blog/archives/301#comments</comments>
		<pubDate>Sun, 27 Jun 2010 17:58:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[随便写写]]></category>
		<category><![CDATA[毕业论文]]></category>
		<category><![CDATA[毕业设计]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=301</guid>
		<description><![CDATA[感谢国家。 感谢指导老师郭老师的帮助，我的毕业设计< 教学质量测评系统的设计与实现 >获得了优秀的成绩，而且作为系里公开答辩的论文,我很欣慰,上午郭老师又打电话来推荐我的毕业设计为院级优秀毕业论文,十分感谢老师。 6月28日1：52分,等会要有阿根廷的比赛。 在过几个钟头就要举行毕业典礼,学位授予仪式了,我要毕业了。 我要毕业了。这次是真的毕业了。 十几年的学生生涯结束了。 以后我不在是学生,我要独立了,我该自己撑起我的一片天。 我毕业了。 感谢老师。]]></description>
			<content:encoded><![CDATA[<p>感谢国家。<br />
感谢指导老师郭老师的帮助，我的毕业设计< <a href="http://www.wenan8.com/lzc.php" target=_blank>教学质量测评系统的设计与实现</a> >获得了优秀的成绩，而且作为系里公开答辩的论文,我很欣慰,上午郭老师又打电话来推荐我的毕业设计为院级优秀毕业论文,十分感谢老师。<br />
6月28日1：52分,等会要有阿根廷的比赛。<br />
在过几个钟头就要举行毕业典礼,学位授予仪式了,我要毕业了。<br />
我要毕业了。这次是真的毕业了。<br />
十几年的学生生涯结束了。<br />
以后我不在是学生,我要独立了,我该自己撑起我的一片天。<br />
我毕业了。<br />
感谢老师。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/301/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ThinkPHP导入Excel</title>
		<link>http://www.wenan8.com/blog/archives/294</link>
		<comments>http://www.wenan8.com/blog/archives/294#comments</comments>
		<pubDate>Mon, 21 Jun 2010 16:19:35 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[EXCEL]]></category>
		<category><![CDATA[ThinkPHP]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=294</guid>
		<description><![CDATA[前面写过一篇PHP读取EXCEL插入Mysql数据库中，应用phpExcelReader导入, 这次做毕业设计时用的ThinkPHP，有个上传学生信息(excel)插入数据库的功能,其实原理一样,先是上传，然后读取内容，然后根据phpExcelReader的read读取各sheet值然后插入数据库。其代码为： import.html 1 2 3 4 5 6 7 &#60;form method=&#34;post&#34; action=&#34;__URL__/import&#34; name=&#34;form1&#34; enctype=&#34;multipart/form-data&#34;&#62; &#60;table cellspacing=&#34;0&#34; cellpadding=&#34;0&#34; border=&#34;1&#34;&#62; &#60;tr&#62; &#60;td &#62;&#60;input type=&#34;file&#34; name=&#34;myfile&#34; /&#62; &#60;input type=&#34;submit&#34; class=&#34;mybutton&#34; name=&#34;import&#34; value=&#34;导入&#34; &#62;&#60;/td&#62; &#60;/tr&#62; &#60;/table&#62; &#60;/form&#62; StudentsAction.class.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [...]]]></description>
			<content:encoded><![CDATA[<p> 前面写过一篇<a href="http://www.wenan8.com/blog/archives/221" target=_blank>PHP读取EXCEL插入Mysql数据库中</a>，应用phpExcelReader导入, 这次做毕业设计时用的ThinkPHP，有个上传学生信息(excel)插入数据库的功能,其实原理一样,先是上传，然后读取内容，然后根据phpExcelReader的read读取各sheet值然后插入数据库。其代码为：<br />
import.html</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="html" style="font-family:monospace;">&lt;form method=&quot;post&quot; action=&quot;__URL__/import&quot; name=&quot;form1&quot; enctype=&quot;multipart/form-data&quot;&gt;
                &lt;table cellspacing=&quot;0&quot; cellpadding=&quot;0&quot; border=&quot;1&quot;&gt;
                    &lt;tr&gt;
		&lt;td &gt;&lt;input type=&quot;file&quot; name=&quot;myfile&quot; /&gt; &lt;input type=&quot;submit&quot; class=&quot;mybutton&quot; name=&quot;import&quot; value=&quot;导入&quot; &gt;&lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/table&gt;
	&lt;/form&gt;</pre></td></tr></table></div>

<p>StudentsAction.class.php</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> StudentsAction <span style="color: #000000; font-weight: bold;">extends</span> Action
<span style="color: #009900;">&#123;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> import<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#123;</span>   
		 <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Type:text/html; charset=utf-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		 Vendor<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Excel.reader'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// 加载reader类。</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">isPost</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    	<span style="color: #009900;">&#123;</span>
    		<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">display</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    	<span style="color: #009900;">&#125;</span>
    	<span style="color: #b1b100;">else</span>
    	<span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myfile'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">!=</span><span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span>
	     <span style="color: #009900;">&#123;</span>
			<span style="color: #000088;">$tmp_file</span><span style="color: #339933;">=</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myfile'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tmp_name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$file_types</span><span style="color: #339933;">=</span><span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;.&quot;</span><span style="color: #339933;">,</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'myfile'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$file_type</span><span style="color: #339933;">=</span><span style="color: #000088;">$file_types</span><span style="color: #009900;">&#91;</span><span style="color: #990000;">count</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_types</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">strtolower</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file_type</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">!=</span><span style="color: #0000ff;">&quot;xls&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">//  echo &quot;&lt;span style=\&quot;color:red;line-height: 25px;\&quot;&gt;格式错误 &lt;a href=\&quot;#\&quot; onclick=history.go(-1);&gt;请返回&lt;/a&gt; &lt;/span&gt;&quot;;</span>
			 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'jumpUrl'</span><span style="color: #339933;">,</span>__URL__<span style="color: #339933;">/</span>import<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		        <span style="color: #000088;">$msg</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;格式错误，请重新上传&quot;</span><span style="color: #339933;">;</span>
    		        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">success</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
			<span style="color: #000088;">$savePath</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Excel/xls/&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Ymdhis'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000088;">$file_name</span><span style="color: #339933;">=</span><span style="color: #000088;">$str</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;.&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$file_type</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #990000;">copy</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$tmp_file</span><span style="color: #339933;">,</span><span style="color: #000088;">$savePath</span><span style="color: #339933;">.</span><span style="color: #000088;">$file_name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #666666; font-style: italic;">//echo &quot;&lt;span style=\&quot;color:red;line-height: 25px;\&quot;&gt;上传错误请重试！！&lt;a href=# onclick=history.go(-1);&gt;[返回]&lt;/a&gt;&lt;/span&gt;&quot;;</span>
				<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'jumpUrl'</span><span style="color: #339933;">,</span>__URL__<span style="color: #339933;">/</span>import<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		        <span style="color: #000088;">$msg</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;上传错误，请重新上传&quot;</span><span style="color: #339933;">;</span>
    		        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">success</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
			<span style="color: #009900;">&#125;</span><span style="color: #b1b100;">else</span><span style="color: #009900;">&#123;</span>
			    <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Spreadsheet_Excel_Reader<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				<span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setOutputEncoding</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'utf-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">read</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Excel/xls/&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$file_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
					<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'numRows'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
                                    <span style="color: #000088;">$number</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>                               <span style="color: #000088;">$passwd</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>	                       <span style="color: #000088;">$name</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span> 
                                    <span style="color: #000088;">$catid</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                                    <span style="color: #000088;">$sex</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                                    <span style="color: #000088;">$tel</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                                    <span style="color: #000088;">$home</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                                    <span style="color: #000088;">$minzu</span><span style="color: #339933;">=</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sheets</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'cells'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">7</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
                                    <span style="color: #000088;">$Students</span><span style="color: #339933;">=</span>D<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Students&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
				 <span style="color: #000088;">$info</span><span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            	                                               <span style="color: #0000ff;">'number'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$number</span><span style="color: #339933;">,</span>
				         <span style="color: #0000ff;">'passwd'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$passwd</span><span style="color: #339933;">,</span>
				         <span style="color: #0000ff;">'name'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span>
				         <span style="color: #0000ff;">'catid'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$catid</span><span style="color: #339933;">,</span>
				         <span style="color: #0000ff;">'sex'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$sex</span><span style="color: #339933;">,</span>
				         <span style="color: #0000ff;">'tel'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$tel</span><span style="color: #339933;">,</span>
				         <span style="color: #0000ff;">'home'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$home</span><span style="color: #339933;">,</span>
            	                                                <span style="color: #0000ff;">'minzu'</span><span style="color: #339933;">=&gt;</span><span style="color: #000088;">$minzu</span><span style="color: #339933;">,</span>
                                                             <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		           <span style="color: #000088;">$Students</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$info</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		            <span style="color: #000088;">$Students</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
                   <span style="color: #009900;">&#125;</span>
		       <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">assign</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'jumpUrl'</span><span style="color: #339933;">,</span>__URL__<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    		        <span style="color: #000088;">$msg</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;学生信息导入成功&quot;</span><span style="color: #339933;">;</span>
    		        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">success</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$msg</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
              	<span style="color: #009900;">&#125;</span>
	     <span style="color: #009900;">&#125;</span>
	  <span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/294/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>mysql表类型MyISAM和InnoDB区别</title>
		<link>http://www.wenan8.com/blog/archives/291</link>
		<comments>http://www.wenan8.com/blog/archives/291#comments</comments>
		<pubDate>Tue, 15 Jun 2010 02:47:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[随便写写]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=291</guid>
		<description><![CDATA[mysql表类型MyISAM和InnoDB区别 MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚，不具有原子性。如果执行大量的SELECT，MyISAM是更好的选择。 InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑，应该使用InnoDB表, 对于支持事物的InnoDB类型的标，影响速度的主要原因是AUTOCOMMIT默认设置是打开的，而且程序没有显式调用BEGIN 开始事务，导致每插入一条都自动Commit，严重影响了速度。可以在执行sql前调用begin，多条sql形成一个事物（即使autocommit打开也可以），将大大提高性能。 1. 4.0以上mysqld都支持事务，包括非max版本。3.23的需要max版本mysqld才能支持事务。 2. 创建表时如果不指定type则默认为myisam，不支持事务。 可以用 show create table tablename 命令看表的类型。 2.1 对不支持事务的表做start/commit操作没有任何效果，在执行commit前已经提交，测试： 执行一个msyql： use test; drop table if exists tn; create table tn (a varchar(10)) type=myisam; drop table if exists ty; create table ty (a varchar(10)) type=innodb; begin; insert into tn values(’a&#8217;); insert into [...]]]></description>
			<content:encoded><![CDATA[<p>mysql表类型MyISAM和InnoDB区别</p>
<p>MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与其他存储引擎比较,MyISAM具有检查和修复表格的大多数工具. MyISAM表格可以被压缩,而且它们支持全文搜索.它们不是事务安全的,而且也不支持外键。如果事物回滚将造成不完全回滚，不具有原子性。如果执行大量的SELECT，MyISAM是更好的选择。</p>
<p>InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性,因此如果需要一个事务安全的存储引擎,建议使用它.如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑，应该使用InnoDB表,</p>
<p>对于支持事物的InnoDB类型的标，影响速度的主要原因是AUTOCOMMIT默认设置是打开的，而且程序没有显式调用BEGIN 开始事务，导致每插入一条都自动Commit，严重影响了速度。可以在执行sql前调用begin，多条sql形成一个事物（即使autocommit打开也可以），将大大提高性能。<br />
1. 4.0以上mysqld都支持事务，包括非max版本。3.23的需要max版本mysqld才能支持事务。</p>
<p>2. 创建表时如果不指定type则默认为myisam，不支持事务。<br />
可以用 show create table tablename 命令看表的类型。</p>
<p><span id="more-291"></span><br />
2.1 对不支持事务的表做start/commit操作没有任何效果，在执行commit前已经提交，测试：<br />
执行一个msyql：<br />
use test;<br />
drop table if exists tn;<br />
create table tn (a varchar(10)) type=myisam;<br />
drop table if exists ty;<br />
create table ty (a varchar(10)) type=innodb;</p>
<p>begin;<br />
insert into tn values(’a&#8217;);<br />
insert into ty values(’a&#8217;);<br />
select * from tn;<br />
select * from ty;<br />
都能看到一条记录</p>
<p>执行另一个mysql：<br />
use test;<br />
select * from tn;<br />
select * from ty;<br />
只有tn能看到一条记录<br />
然后在另一边<br />
commit;<br />
才都能看到记录。</p>
<p>3. 可以执行以下命令来切换非事务表到事务（数据不会丢失），innodb表比myisam表更安全：<br />
alter table tablename type=innodb;</p>
<p>3.1 innodb表不能用repair table命令和myisamchk -r table_name<br />
但可以用check table，以及mysqlcheck [OPTIONS] database [tables]</p>
<p>4. 启动mysql数据库的命令行中添加了以下参数可以使新发布的mysql数据表都默认为使用事务（<br />
只影响到create语句。）<br />
–default-table-type=InnoDB<br />
测试命令：<br />
use test;<br />
drop table if exists tn;<br />
create table tn (a varchar(10));<br />
show create table tn;<br />
5. 临时改变默认表类型可以用：<br />
set table_type=InnoDB;<br />
show variables like ‘table_type’;<br />
或：<br />
c:mysqlbinmysqld-max-nt –standalone –default-table-type=InnoDB<br />
于mysql来说，最具有代表性的表存储引擎就是InnoDB和MyISAM.两者之间最主要的区别就是是否进行：是否进行外键的数据完整性检查。<br />
InnoDB 存储引擎支持对外键约束的检查功能，这些约束包括 delete,update,cascade(这个具体是什么含义，留待以后补充) 。<br />
外键约束检查（外键增强）的好处或者优点是：<br />
1           如果关联设计恰当，可以使程序员更难将数据不一致性引入数据库<br />
2           数据库服务器具有集中式约束检查功能，就可以不必再应用程序一侧对数据进行该类检查，从而避免了不同的引用程序使用不同的方式去检查约束。<br />
3           使用级联更新和删除，简化了应用程序代码<br />
4           设计欠当的关联，有助于使用文档的方式记录表间的关系<br />
但是以上的好处，需要数据库服务器为执行此类检查花费额外的开销，增加了数据库服务器的负担，进而影响数据库的性能。<br />
如果在表中不需要外键，也想避免引用完整性的检查，则可以选择使用MyISAM存储引擎。对于那些只有insert和select的应用程序，选择MyISAM会获得更好的性能。但是如果使用MyISAM引擎时，如果有外键关联，那么需要再应用程序级的层面上处理这类关联，使得数据的完整性获得保证。<br />
         DBA（数据库管理员）要创建拓扑关联，这样会导致恢复单个表变的困难（加载依赖其他表的表时，MySQL允许你临时禁止外键检查，从而降低了该难度）。对于存在外键的表的，需要注意这个问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/291/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编写跨浏览器兼容的 CSS 代码的金科玉律</title>
		<link>http://www.wenan8.com/blog/archives/288</link>
		<comments>http://www.wenan8.com/blog/archives/288#comments</comments>
		<pubDate>Mon, 14 Jun 2010 07:52:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[WEB标准]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[兼容性]]></category>
		<category><![CDATA[跨浏览器]]></category>

		<guid isPermaLink="false">http://www.wenan8.com/blog/?p=288</guid>
		<description><![CDATA[作为 Web 设计师，你的网站在各种浏览器中有完全一样的表现是很多人的目标，然而这是一个永远无法真正实现的目标，很多人认为，完美的跨 浏览器兼容并不必要，这样说虽然没错，但在很多情形，一种近似的兼容还是很容易实现的，本文讲的是各种跨浏览器兼容的 CSS 编码准则和技巧。 理解 CSS 盒子模型 如果你想实现不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码，透彻地理解 CSS 盒子模型是首要事情，CSS 盒子模型并不难，且基本支持所有浏览器，除了某些特定条件下的 IE 浏览器。 CSS 盒子模型负责处理以下事情: # 一个 blcok （区块）级对象占据多大的空间 # 该对象的边界，留白 # 盒子的尺寸 # 盒子与页面其它元素的相对位置 CSS 盒子模型有以下准则: # Block （区块）对象都是矩形 （事实上所有对象都如此） # 其尺寸由 width, height, padding, borders, 以及 margins 决定 # 如果不设置高度，该盒子的高度将自动适应其包含的内容，加上留白等（除非使用了 float） # 如果不设置宽度，一个非 float 型盒子水平上将充满其父容器（扣除父容器的留白） 处理 block 级对象时，必须注意以下事项: # [...]]]></description>
			<content:encoded><![CDATA[<p>作为 Web 设计师，你的网站在各种浏览器中有完全一样的表现是很多人的目标，然而这是一个永远无法真正实现的目标，很多人认为，完美的跨 浏览器兼容并不必要，这样说虽然没错，但在很多情形，一种近似的兼容还是很容易实现的，本文讲的是各种跨浏览器兼容的 CSS 编码准则和技巧。<br />
<a href="http://www.wenan8.com/blog/wp-content/uploads/2010/06/1.jpg"><img src="http://www.wenan8.com/blog/wp-content/uploads/2010/06/1-300x300.jpg" alt="css" title="css" width="300" height="300" class="aligncenter size-medium wp-image-287" /></a><br />
理解 CSS 盒子模型<br />
如果你想实现不需要很多奇巧淫技的跨浏览器兼容的 CSS 代码，透彻地理解 CSS 盒子模型是首要事情，CSS 盒子模型并不难，且基本支持所有浏览器，除了某些特定条件下的 IE 浏览器。</p>
<p>CSS 盒子模型负责处理以下事情:<br />
# 一个 blcok （区块）级对象占据多大的空间<br />
# 该对象的边界，留白<br />
# 盒子的尺寸<br />
# 盒子与页面其它元素的相对位置</p>
<p>CSS 盒子模型有以下准则:<br />
# Block （区块）对象都是矩形 （事实上所有对象都如此）<br />
# 其尺寸由 width, height, padding, borders, 以及 margins 决定<br />
# 如果不设置高度，该盒子的高度将自动适应其包含的内容，加上留白等（除非使用了 float）<br />
# 如果不设置宽度，一个非 float 型盒子水平上将充满其父容器（扣除父容器的留白）</p>
<p>处理 block 级对象时，必须注意以下事项:<br />
# 如果一个盒子的宽度设置为 100%，它就不能再设置 margins, padding, 和 borders，否则会撑破其父容器<br />
# 垂直毗邻的 margin 会引起复杂的坍塌问题，导致布局问题（比如两个垂直毗邻的 Block 对象，上面的对象的 bottom-margin 为 40，下面的对象的 top-margin 为 20，则两个对象的间距将是 40，而不是 60 ）<br />
# 拥有相对位置和绝对位置的对象，拥有不同的行为<br />
<a href="http://www.wenan8.com/blog/wp-content/uploads/2010/06/2.gif"><img src="http://www.wenan8.com/blog/wp-content/uploads/2010/06/2-300x162.gif" alt="css box" title="css box" width="300" height="162" class="aligncenter size-medium wp-image-289" /></a><br />
在 Firefox 的 Firebug 中显示的盒子模型<br />
<span id="more-288"></span><br />
理解 block 级和 inline 级 对象的区别<br />
这个看似简单的问题事如果能透彻地理解，会受益匪浅。</p>
<p>下图讲解了 block 级对象和 inline 级对象的区别:</p>
<p><img src="http://www.unixcom.cn/attachments/forumid_19/10060914570303e3a1ccb29628.jpg" alt="inline-block" /><br />
下面是 block 级对象和 inline 级对象的基本区别:<br />
# Block 级对象会自然地水平充满其父容器，因此没有必要为之设置 100% 宽度属性<br />
# Block 级对象的起始摆放位置是其父容器的左上边界，并顺排在其前面的兄弟 Block 对象的下方（除非设置 float 或绝对位置）<br />
# Inline 级对象会忽略其宽度和高度设置<br />
# Inline 级对象会随着文字排版，并受排版属性的影响（如 white-space, font-size, letter-spacing）<br />
# Inline 级对象可以使用 vertical-align 属性控制其垂直对齐，block 级对象不可以<br />
# Inline 级对象的下方会保留一些自然的空间，以适应字母 g 一类的会向下探出的笔画<br />
# 一个设置为 float 的 inline 对象将变成 block 对象<br />
理解 Floating 和 Clearing 属性<br />
实现多栏排版的最好方法是使用 float 属性，float 也是一个将使你受益匪浅的属性。一个 float 对象可以居左或居右，一个设置为 float 的对象，将根据设置的方向，左移或右移到其父容器的边界，或其前面的 float 对象的边界，而紧随其后的非 float 对象或内容，则包围在其相反的方向。<br />
<img src="http://www.unixcom.cn/attachments/forumid_19/1006091458488a3335cdf93796.jpg" alt="block" /><br />
以下是使用 float 和 clear 属性的一些重要准则:<br />
# 一个 float 对象，将从其置身的 block 级非 float 内容流中跳出，换句话说，如果你要将一个 box 向左边 float，它后面的 block 级非 float 对象会显示到下方，inline 级内容会在旁边包围<br />
# 要让一段内容从一侧包围一个 float 对象，这段内容必须要么是 inline 级的，要么也设置为相同方向的 float<br />
# 一个 float 对象，如果没有设置宽度，则会自动缩成其包含的内容的宽度，因此最好为 float 对象明确设置宽度<br />
# 如果一个 block 对象包含 float 子对象，会出现本文中阐述的问题。<br />
# 一个设置了 clear 属性的对象，将不会包围其前面的 float 对象<br />
# 一个既设置了 clear 又设置了 float 属性的对象，只有 clear:left 属性生效，clear:right 不起作用<br />
首先使用 IE 进行测试<br />
虽然我们都痛恨 IE6 和 IE7，但当你开始一个新项目的时候，最好还是首先针对这两种浏览器进行测试，否则，如果你在设计在后期才想起针对 IE6 和 IE7 进行测试，将出现以下问题：<br />
# 你将不得不使用一些奇巧淫技，甚至使用独立的 IE6/7 CSS，导致 CSS 文件臃肿。<br />
# 某些地方的布局将不得不重新设计<br />
# 会增加测试的时间<br />
# 你的布局在 IE/6/7 中和其它浏览器中不一样</p>
<p>如果你设计的是个人项目，Web 程序等，则不建议你针对旧版本 IE 做太多工作，而对一些公司类站点，它的用户群中有大量 IE 用户，这些技巧会让你避免大量的头痛。如果将 IE 的问题归类为 IE 的 BUG 而不去处理，会带来很多负面的影响，和 IE 和平共处是 Web 开发与设计者不可逃避的现实。</p>
<p>在译者注： IE6/7 仍有大量用户基础的国内（感谢中行，建行，农行，工行，以及各级政府网站），忽视这两种浏览器是极不明智的，首先针对 IE6/7 进行设计是一种很好的方法，一般来说，在IE6/7 通过测试的站点，在 Firefox，Chrome，Safari，Opera 等标准浏览器面前基本不会出现问题，前提是，你的 CSS 设计是基于 W3C 标准的。<br />
# IE 浏览器最常见的问题 IE6 中不可滥用 float，否则会带来内容消失以及文字重复等稀奇古怪的问题<br />
# IE6 中，float 对象，在 float 方向的那边，会出现双倍 margin，将 display 设置为 inline 会解决这个问题<br />
# IE6/7 中，一个没有直接或间接设置 hasLayout 的对象，会发生各种稀奇古怪的问题 （译者注：对这类问题，zoom 这个 css 属性可以帮很大的忙，将 zoom 设置为除了 normal 之外的其它值，可以迫使一个对象 hasLayout 同时不影响这个对象的任何视觉外观）<br />
# IE6 不支持 min-width, max-width, min-height, max-height 一类的属性<br />
# IE6 不支持固定位置背景图<br />
# IE6/7 不支持很多 display 属性值（如 inline-table, table-cell, table-row）<br />
# IE6 中，只有 a 这个对象才可以使用 :hover 这个伪类<br />
# IE 的某些版本对某些 CSS 选择器支持很少（如属性选择器，子对象选择器）<br />
# IE6~8 对 CSS3 的支持很有限 (不过有一些变通方法)<br />
永远不要指望在所有浏览器中都一模一样<br />
在不同浏览器实现相同的体验个功能是可能的，实现近似像素级的一致外观也是可能的，但永远不要指望一模一样。<br />
Form 控件在不同浏览器显示总是不同</p>
<p>以下是 Facebook 首页中的 select 控件，在5种不同浏览器的显示差异（基于 Adobe’s Browserlab 截图）<br />
<img src="http://www.unixcom.cn/attachments/forumid_19/1006091458d5eacabe1d58b253.jpg" alt="form" /><br />
某些 Form 控件，如果要求必须跨浏览器一致，可以找到变通办法，如，可以使用图片 替代 submit 按钮，但有一些控件，比如 radio，select， textarea，文件选择框，是永远都不可能一模一样的。<br />
字体的表现都有差异<br />
先不谈有的字体在有的系统中根本不存在，即时存在，它们在不同系统的渲染效果也不完全一样，比如，Windows ClearType 支持 IE7，但不支持 IE6，导致同一个字体在 IE7 和 IE6 有不同的样子。<br />
<img src="http://www.unixcom.cn/attachments/forumid_19/1006091458ffe2696d1525a4e9.jpg" alt="img" /><br />
A List Apart’s 文章字体在 IE6 and IE7 中的区别</p>
<p>使用 CSS 清零<br />
使用 CSS 清零（CSS Reset）是实现跨浏览器兼容的灵丹妙药，CSS 清零可以消除不同浏览器对 margin，padding 这些属性的默认表现，你可以更容易控制诸如对齐，间隙等等问题。推荐使用 Eric Meyer’s CSS 清零代码。<br />
<img src="http://www.unixcom.cn/attachments/forumid_19/10060914585d5dbb04efb5bb44.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.wenan8.com/blog/archives/288/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
