<?xml version="1.0" encoding="UTF-8"?>
  <feed xmlns="http://www.w3.org/2005/Atom">
  <title type="html"><![CDATA[海峡IT网]]></title>
  <subtitle type="html"><![CDATA[海峡IT网,创造价值,传播技术,分享快乐!]]></subtitle>
  <id>http://www.haixiaIT.com/</id> 
  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/" /> 
  <link rel="self" type="application/atom+xml" href="http://www.haixiaIT.com/atom.asp" /> 
  <generator uri="http://www.pjhome.net/" version="2.4.1022">PJBlog2</generator> 
  <updated>2008-07-19T15:32:12+08:00</updated> 

  <entry>
	  <title type="html"><![CDATA[mysql的字符串函数]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=21" label="PHP" /> 
	  <updated>2008-07-19T15:32:12+08:00</updated>
	  <published>2008-07-19T15:32:12+08:00</published>
		  <summary type="html"><![CDATA[<p>对于针对字符串位置的操作，第一个位置被标记为1。 </p>
<dl compact="compact"><dt><strong><code><font face="新宋体">ASCII(str)</font></code> </strong></dt><dd><a name="IDX378"></a><strong>返回字符串<code><font face="新宋体">str</font></code>的最左面字符的ASCII代码值。</strong>如果<code><font face="新宋体">str</font></code>是空字符串，返回<code><font face="新宋体">0</font></code>。如果<code><font face="新宋体">str</font></code>是<code><font face="新宋体">NULL</font></code>，返回<code><font face="新宋体">NULL</font></code>。
<pre>mysql&gt; select ASCII('2');
-&gt; 50
mysql&gt; select ASCII(2);
-&gt; 50
mysql&gt; select ASCII('dx');
-&gt; 100</pre>
<p>也可参见ORD()函数。 <a name="IDX379"></a></p>
</dd><dt><code><font face="新宋体"><strong>ORD(str)</strong></font></code> </dt><dd>如果字符串str最左面字符是一个多字节字符，通过以格式<code><font face="新宋体">((first byte ASCII code)*256+(second byte ASCII code))[*256+third byte ASCII code...]</font></code>返回字符的ASCII代码值来返回多字节字符代码。如果最左面的字符不是一个多字节字符。返回与<code><font face="新宋体">ASCII()</font></code>函数返回的相同值。
<pre>mysql&gt; select orD('2');
-&gt; 50
</pre>
</dd><dt><code><font face="新宋体"><strong>CONV(N,from_base,to_base)</strong></font></code> </dt><dd>在不同的数字基之间变换数字。返回数字<code><font face="新宋体">N</font></code>的字符串数字，从<code><font face="新宋体">from_base</font></code>基变换为<code><font face="新宋体">to_base</font></code>基，如果任何参数是<code><font face="新宋体">NULL</font></code>，返回<code><font face="新宋体">NULL</font></code>。参数<code><font face="新宋体">N</font></code>解释为一个整数，但是可以指定为一个整数或一个字符串。最小基是<code><font face="新宋体">2</font></code>且最大的基是<code><font face="新宋体">36</font></code>。如果<code><font face="新宋体">to_base</font></code>是一个负数，<code><font face="新宋体">N</font></code>被认为是一个有符号数，否则，<code><font face="新宋体">N</font></code>被当作无符号数。 <code><font face="新宋体">CONV</font></code>以64位点精度工作。
<pre>mysql&gt; select CONV(&quot;a&quot;,16,2);
-&gt; '1010'
mysql&gt; select CONV(&quot;6E&quot;,18,8);
-&gt; '172'
mysql&gt; select CONV(-17,10,-18);
-&gt; '-H'
mysql&gt; select CONV(10+&quot;10&quot;+'10'+0xa,10,10);
-&gt; '40'
<a name="IDX381"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>BIN(N)</strong></font></code> </dt><dd>返回二进制值<code><font face="新宋体">N</font></code>的一个字符串表示，在此<code><font face="新宋体">N</font></code>是一个长整数(<code><font face="新宋体">BIGINT</font></code>)数字，这等价于<code><font face="新宋体">CONV(N,10,2)</font></code>。如果<code><font face="新宋体">N</font></code>是<code><font face="新宋体">NULL</font></code>，返回<code><font face="新宋体">NULL</font></code>。
<pre>mysql&gt; select BIN(12);
-&gt; '1100'
</pre>
</dd><dt><strong><code><font face="新宋体">OCT(N)</font></code> </strong></dt><dd>返回八进制值<code><font face="新宋体">N</font></code>的一个字符串的表示，在此<code><font face="新宋体">N</font></code>是一个长整型数字，这等价于<code><font face="新宋体">CONV(N,10,8)</font></code>。如果<code><font face="新宋体">N</font></code>是NULL，返回<code><font face="新宋体">NULL</font></code>。
<pre>mysql&gt; select OCT(12);
-&gt; '14'
</pre>
</dd><dt><strong><code><font face="新宋体">HEX(N)</font></code> </strong></dt><dd>返回十六进制值<code><font face="新宋体">N</font></code>一个字符串的表示，在此<code><font face="新宋体">N</font></code>是一个长整型(<code><font face="新宋体">BIGINT</font></code>)数字，这等价于<code><font face="新宋体">CONV(N,10,16)</font></code>。如果<code><font face="新宋体">N</font></code>是<code><font face="新宋体">NULL</font></code>，返回<code><font face="新宋体">NULL</font></code>。
<pre>mysql&gt; select HEX(255);
-&gt; 'FF'
<a name="IDX384"></a> </pre>
</dd><dt><strong><code><font face="新宋体">CHAR(N,...)</font></code> </strong></dt><dd><strong><code><font face="新宋体">CHAR()</font></code>将参数解释为整数并且返回由这些整数的ASCII代码字符组成的一个字符串。</strong><code><font face="新宋体">NULL</font></code>值被跳过。
<pre>mysql&gt; select CHAR(77,121,83,81,'76');
-&gt; 'MySQL'
mysql&gt; select CHAR(77,77.3,'77.3');
-&gt; 'MMM'
</pre>
</dd><dt><strong><code><font face="新宋体">CONCAT(str1,str2,...)</font></code> </strong></dt><dd><strong>返回来自于参数连结的字符串</strong>。如果任何参数是<code><font face="新宋体">NULL</font></code>，返回<code><font face="新宋体">NULL</font></code>。可以有超过2个的参数。一个数字参数被变换为等价的字符串形式。
<pre>mysql&gt; select CONCAT('My', 'S', 'QL');
-&gt; 'MySQL'
mysql&gt; select CONCAT('My', NULL, 'QL');
-&gt; NULL
mysql&gt; select CONCAT(14.3);
-&gt; '14.3'
</pre>
</dd><dt><strong><code><font face="新宋体">LENGTH(str)</font></code> </strong></dt><dd><strong>　 </strong></dd><dt><strong><code><font face="新宋体">OCTET_LENGTH(str)</font></code> </strong></dt><dd><strong>　 </strong></dd><dt><strong><code><font face="新宋体">CHAR_LENGTH(str)</font></code> </strong></dt><dd><strong>　 </strong></dd><dt><code><font face="新宋体"><strong>CHARACTER_LENGTH(str)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>的长度。
<pre>mysql&gt; select LENGTH('text');
-&gt; 4
mysql&gt; select OCTET_LENGTH('text');
-&gt; 4
</pre>
<p>注意，对于多字节字符，其CHAR_LENGTH()仅计算一次。 <a name="IDX390"></a><a name="IDX391"></a></p>
</dd><dt><code><font face="新宋体"><strong>LOCATE(substr,str)</strong></font></code> </dt><dd>　 </dd><dt><code><font face="新宋体"><strong>POSITION(substr IN str)</strong></font></code> </dt><dd>返回子串<code><font face="新宋体">substr</font></code>在字符串<code><font face="新宋体">str</font></code>第一个出现的位置，如果<code><font face="新宋体">substr</font></code>不是在<code><font face="新宋体">str</font></code>里面，返回<code><font face="新宋体">0</font></code>.
<pre>mysql&gt; select LOCATE('bar', 'foobarbar');
-&gt; 4
mysql&gt; select LOCATE('xbar', 'foobar');
-&gt; 0
</pre>
<pre>该函数是多字节可靠的。 <a name="IDX392"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>LOCATE(substr,str,pos)</strong></font></code> </dt><dd>返回子串<code><font face="新宋体">substr</font></code>在字符串<code><font face="新宋体">str</font></code>第一个出现的位置，从位置<code><font face="新宋体">pos</font></code>开始。如果<code><font face="新宋体">substr</font></code>不是在<code><font face="新宋体">str</font></code>里面，返回<code><font face="新宋体">0</font></code>。
<pre>mysql&gt; select LOCATE('bar', 'foobarbar',5);
-&gt; 7
</pre>
<p>这函数是多字节可靠的。 <a name="IDX393"></a></p>
</dd><dt><code><font face="新宋体"><strong>INSTR(str,substr)</strong></font></code> </dt><dd>返回子串<code><font face="新宋体">substr</font></code>在字符串<code><font face="新宋体">str</font></code>中的第一个出现的位置。这与有2个参数形式的<code><font face="新宋体">LOCATE()</font></code>相同，除了参数被颠倒。
<pre>mysql&gt; select INSTR('foobarbar', 'bar');
-&gt; 4
mysql&gt; select INSTR('xbar', 'foobar');
-&gt; 0
</pre>
<p>这函数是多字节可靠的。 <a name="IDX394"></a></p>
</dd><dt><code><font face="新宋体"><strong>LPAD(str,len,padstr)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>，左面用字符串<code><font face="新宋体">padstr</font></code>填补直到<code><font face="新宋体">str</font></code>是<code><font face="新宋体">len</font></code>个字符长。
<pre>mysql&gt; select LPAD('hi',4,'??');
-&gt; '??hi'
<a name="IDX395"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>RPAD(str,len,padstr)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>，右面用字符串<code><font face="新宋体">padstr</font></code>填补直到<code><font face="新宋体">str</font></code>是<code><font face="新宋体">len</font></code>个字符长。 &nbsp;
<pre>mysql&gt; select RPAD('hi',5,'?');
-&gt; 'hi???'
</pre>
</dd><dt><code><font face="新宋体"><strong>LEFT(str,len)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>的最左面<code><font face="新宋体">len</font></code>个字符。
<pre>mysql&gt; select LEFT('foobarbar', 5);
-&gt; 'fooba'
</pre>
<p>该函数是多字节可靠的。 <a name="IDX397"></a></p>
</dd><dt><code><font face="新宋体"><strong>RIGHT(str,len)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>的最右面<code><font face="新宋体">len</font></code>个字符<code><font face="新宋体">。</font></code>
<pre>mysql&gt; select RIGHT('foobarbar', 4);
-&gt; 'rbar'
</pre>
<p>该函数是多字节可靠的。 <a name="IDX398"></a><a name="IDX399"></a></p>
</dd><dt><code><font face="新宋体"><strong>SUBSTRING(str,pos,len)</strong></font></code> </dt><dd>　 </dd><dt><code><font face="新宋体"><strong>SUBSTRING(str FROM pos FOR len)</strong></font></code> </dt><dd>　 </dd><dt><code><font face="新宋体"><strong>MID(str,pos,len)</strong></font></code> </dt><dd>从字符串<code><font face="新宋体">str</font></code>返回一个<code><font face="新宋体">len</font></code>个字符的子串，从位置<code><font face="新宋体">pos</font></code>开始。使用<code><font face="新宋体">FROM</font></code>的变种形式是ANSI SQL92语法。
<pre>mysql&gt; select SUBSTRING('Quadratically',5,6);
-&gt; 'ratica'
</pre>
<p>该函数是多字节可靠的。 <a name="IDX400"></a></p>
</dd><dt><code><font face="新宋体"><strong>SUBSTRING(str,pos)</strong></font></code> </dt><dd>　 </dd><dt><code><font face="新宋体"><strong>SUBSTRING(str FROM pos)</strong></font></code> </dt><dd>从字符串<code><font face="新宋体">str</font></code>的起始位置<code><font face="新宋体">pos</font></code>返回一个子串。
<pre>mysql&gt; select SUBSTRING('Quadratically',5);
-&gt; 'ratically'
mysql&gt; select SUBSTRING('foobarbar' FROM 4);
-&gt; 'barbar'
</pre>
<p>该函数是多字节可靠的。 <a name="IDX401"></a></p>
</dd><dt><code><font face="新宋体"><strong>SUBSTRING_INDEX(str,delim,count)</strong></font></code> </dt><dd>返回从字符串<code><font face="新宋体">str</font></code>的第<code><font face="新宋体">count</font></code>个出现<code><font face="新宋体">的</font></code>分隔符<code><font face="新宋体">delim</font></code>之后的子串。如果<code><font face="新宋体">count</font></code>是正数，返回最后的分隔符到左边(从左边数) 的所有字符。如果<code><font face="新宋体">count</font></code>是负数，返回最后的分隔符到右边的所有字符(从右边数)。
<pre>mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', 2);
-&gt; 'www.mysql'
mysql&gt; select SUBSTRING_INDEX('www.mysql.com', '.', -2);
-&gt; 'mysql.com'
</pre>
<p>该函数对多字节是可靠的。 <a name="IDX402"></a></p>
</dd><dt><code><font face="新宋体"><strong>LTRIM(str)</strong></font></code> </dt><dd>返回删除了其前置空格字符的字符串<code><font face="新宋体">str</font></code>。
<pre>mysql&gt; select LTRIM('  barbar');
-&gt; 'barbar'
</pre>
</dd><dt><code><font face="新宋体"><strong>RTRIM(str)</strong></font></code> </dt><dd>返回删除了其拖后空格字符的字符串<code><font face="新宋体">str</font></code>。
<pre>mysql&gt; select RTRIM('barbar   ');
-&gt; 'barbar'
</pre>
<pre>该函数对多字节是可靠的。 <a name="IDX404"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>，其所有<code><font face="新宋体">remstr</font></code>前缀或后缀被删除了。如果没有修饰符<code><font face="新宋体">BOTH</font></code>、<code><font face="新宋体">LEADING</font></code>或<code><font face="新宋体">TRAILING</font></code>给出，<code><font face="新宋体">BOTH</font></code>被假定。如果<code><font face="新宋体">remstr</font></code>没被指定，空格被删除。
<pre>mysql&gt; select TRIM('  bar   ');
-&gt; 'bar'
mysql&gt; select TRIM(LEADING 'x' FROM 'xxxbarxxx');
-&gt; 'barxxx'
mysql&gt; select TRIM(BOTH 'x' FROM 'xxxbarxxx');
-&gt; 'bar'
mysql&gt; select TRIM(TRAILING 'xyz' FROM 'barxxyz');
-&gt; 'barx'
</pre>
<p>该函数对多字节是可靠的。 <a name="IDX405"></a></p>
</dd><dt><code><font face="新宋体"><strong>SOUNDEX(str)</strong></font></code> </dt><dd>返回<code><font face="新宋体">str</font></code>的一个同音字符串。听起来&ldquo;大致相同&rdquo;的2个字符串应该有相同的同音字符串。一个&ldquo;标准&rdquo;的同音字符串长是4个字符，但是<code><font face="新宋体">SOUNDEX()</font></code>函数返回一个任意长的字符串。你可以在结果上使用<code><font face="新宋体">SUBSTRING()</font></code>得到一个&ldquo;标准&rdquo;的 同音串。所有非数字字母字符在给定的字符串中被忽略。所有在A-Z之外的字符国际字母被当作元音。
<pre>mysql&gt; select SOUNDEX('Hello');
-&gt; 'H400'
mysql&gt; select SOUNDEX('Quadratically');
-&gt; 'Q36324'
<a name="IDX406"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>SPACE(N)</strong></font></code> </dt><dd>返回由<code><font face="新宋体">N</font></code>个空格字符组成的一个字符串。
<pre>mysql&gt; select SPACE(6);
-&gt; '      '
<a name="IDX407"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>REPLACE(str,from_str,to_str)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>，其字符串<code><font face="新宋体">from_str</font></code>的所有出现由字符串<code><font face="新宋体">to_str</font></code>代替。
<pre>mysql&gt; select REPLACE('www.mysql.com', 'w', 'Ww');
-&gt; 'WwWwWw.mysql.com'
</pre>
<p>该函数对多字节是可靠的。 <a name="IDX408"></a></p>
</dd><dt><code><font face="新宋体"><strong>REPEAT(str,count)</strong></font></code> </dt><dd>返回由重复<code><font face="新宋体">count</font></code>Times次的字符串<code><font face="新宋体">str</font></code>组成的一个字符串。如果<code><font face="新宋体">count &lt;= 0</font></code>，返回一个空字符串。如果<code><font face="新宋体">str</font></code>或<code><font face="新宋体">count</font></code>是<code><font face="新宋体">NULL</font></code>，返回<code><font face="新宋体">NULL</font></code>。
<pre>mysql&gt; select REPEAT('MySQL', 3);
-&gt; 'MySQLMySQLMySQL'
<a name="IDX409"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>REVERSE(str)</strong></font></code> </dt><dd>返回颠倒字符顺序的字符串<code><font face="新宋体">str</font></code>。
<pre>mysql&gt; select REVERSE('abc');
-&gt; 'cba'
</pre>
<p>该函数对多字节可靠的。 <a name="IDX410"></a></p>
</dd><dt><code><font face="新宋体"><strong>Insert(str,pos,len,newstr)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>，在位置<code><font face="新宋体">pos</font></code>起始的子串且<code><font face="新宋体">len</font></code>个字符长得子串由字符串<code><font face="新宋体">newstr</font></code>代替。
<pre>mysql&gt; select Insert('Quadratic', 3, 4, 'What');
-&gt; 'QuWhattic'
</pre>
<p>该函数对多字节是可靠的。 <a name="IDX411"></a></p>
</dd><dt><code><font face="新宋体"><strong>ELT(N,str1,str2,str3,...)</strong></font></code> </dt><dd>如果<code><font face="新宋体">N</font></code>= <code><font face="新宋体">1</font></code>，返回<code><font face="新宋体">str1</font></code>，如果<code><font face="新宋体">N</font></code>= <code><font face="新宋体">2</font></code>，返回<code><font face="新宋体">str2</font></code>，等等。如果<code><font face="新宋体">N</font></code>小于<code><font face="新宋体">1</font></code>或大于参数个数，返回<code><font face="新宋体">NULL</font></code>。<code><font face="新宋体">ELT()</font></code>是<code><font face="新宋体">FIELD()</font></code>反运算。
<pre>mysql&gt; select ELT(1, 'ej', 'Heja', 'hej', 'foo');
-&gt; 'ej'
mysql&gt; select ELT(4, 'ej', 'Heja', 'hej', 'foo');
-&gt; 'foo'
</pre>
</dd><dt><code><font face="新宋体"><strong>FIELD(str,str1,str2,str3,...)</strong></font></code> </dt><dd>返回<code><font face="新宋体">str</font></code>在<code><font face="新宋体">str1</font></code>, <code><font face="新宋体">str2</font></code>, <code><font face="新宋体">str3</font></code>, <code><font face="新宋体">...</font></code>清单的索引。如果<code><font face="新宋体">str</font></code>没找到，返回<code><font face="新宋体">0</font></code>。<code><font face="新宋体">FIELD()</font></code>是<code><font face="新宋体">ELT()</font></code>反运算。
<pre>mysql&gt; select FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-&gt; 2
mysql&gt; select FIELD('fo', 'Hej', 'ej', 'Heja', 'hej', 'foo');
-&gt; 0
</pre>
</dd><dt><code><font face="新宋体"><strong>FIND_IN_SET(str,strlist)</strong></font></code> </dt><dd>如果字符串<code><font face="新宋体">str</font></code>在由<code><font face="新宋体">N</font></code>子串组成的表<code><font face="新宋体">strlist</font></code>之中，返回一个<code><font face="新宋体">1</font></code>到<code><font face="新宋体">N</font></code>的值。一个字符串表是被<samp><font face="新宋体">&ldquo;,&rdquo;</font></samp>分隔的子串组成的一个字符串。如果第一个参数是一个常数字符串并且第二个参数是一种类型为<code><font face="新宋体">SET</font></code>的列，<code><font face="新宋体">FIND_IN_SET()</font></code>函数被优化而使用位运算！如果<code><font face="新宋体">str</font></code>不是在<code><font face="新宋体">strlist</font></code>里面或如果<code><font face="新宋体">strlist</font></code>是空字符串，返回<code><font face="新宋体">0</font></code>。如果任何一个参数是<code><font face="新宋体">NULL</font></code>，返回<code><font face="新宋体">NULL</font></code>。如果第一个参数包含一个<samp><font face="新宋体">&ldquo;,&rdquo;</font></samp>，该函数将工作不正常。
<pre>mysql&gt; Select FIND_IN_SET('b','a,b,c,d');
-&gt; 2
<a name="IDX414"></a> </pre>
</dd><dt><code><font face="新宋体"><strong>MAKE_SET(bits,str1,str2,...)</strong></font></code> </dt><dd>返回一个集合 (包含由<samp><font face="新宋体">&ldquo;,&rdquo;</font></samp>字符分隔的子串组成的一个字符串)，由相应的位在<code><font face="新宋体">bits</font></code>集合中的的字符串组成。<code><font face="新宋体">str1</font></code>对应于位0，<code><font face="新宋体">str2</font></code>对应位1，等等。在<code><font face="新宋体">str1</font></code>, <code><font face="新宋体">str2</font></code>, <code><font face="新宋体">...</font></code>中的<code><font face="新宋体">NULL</font></code>串不添加到结果中。
<pre>mysql&gt; Select MAKE_SET(1,'a','b','c');
-&gt; 'a'
mysql&gt; Select MAKE_SET(1 | 4,'hello','nice','world');
-&gt; 'hello,world'
mysql&gt; Select MAKE_SET(0,'a','b','c');
-&gt; ''
</pre>
</dd><dt><code><font face="新宋体"><strong>EXPORT_SET(bits,on,off,[separator,[number_of_bits]])</strong></font></code> </dt><dd>返回一个字符串，在这里对于在&ldquo;bits&rdquo;中设定每一位，你得到一个&ldquo;on&rdquo;字符串，并且对于每个复位(reset)的位，你得到一个&ldquo;off&rdquo;字符串。每个字符串用&ldquo;separator&rdquo;分隔(缺省&ldquo;,&rdquo;)，并且只有&ldquo;bits&rdquo;的&ldquo;number_of_bits&rdquo; (缺省64)位被使用。
<pre>mysql&gt; select EXPORT_SET(5,'Y','N',',',4)
-&gt; Y,N,Y,N
</pre>
</dd><dt><strong><code><font face="新宋体">LCASE(str)</font></code> </strong></dt><dd><strong>　 </strong></dd><dt><code><font face="新宋体"><strong>LOWER(str)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成小写。该函数对多字节是可靠的。
<pre>mysql&gt; select LCASE('QUADRATICALLY');
-&gt; 'quadratically'
<a name="IDX419"></a> </pre>
</dd><dt><strong><code><font face="新宋体">UCASE(str)</font></code> </strong></dt><dd><strong>　 </strong></dd><dt><code><font face="新宋体"><strong>UPPER(str)</strong></font></code> </dt><dd>返回字符串<code><font face="新宋体">str</font></code>，根据当前字符集映射(缺省是ISO-8859-1 Latin1)把所有的字符改变成大写。该函数对多字节是可靠的。
<pre>mysql&gt; select UCASE('Hej');
-&gt; 'HEJ'
</pre>
<p>该函数对多字节是可靠的。 <a name="IDX420"></a></p>
</dd><dt><code><font face="新宋体"><strong>LOAD_FILE(file_name)</strong></font></code> </dt><dd>读入文件并且作为一个字符串返回文件内容。文件必须在服务器上，你必须指定到文件的完整路径名，而且你必须有<strong>file</strong>权限。文件必须所有内容都是可读的并且小于<code><font face="新宋体">max_allowed_packet</font></code>。如果文件不存在或由于上面原因之一不能被读出，函数返回<code><font face="新宋体">NULL</font></code>。
<pre>mysql&gt; Update table_name
SET blob_column=LOAD_FILE(&quot;/tmp/picture&quot;)
Where id=1;
</pre>
</dd></dl>
<p><strong>MySQL</strong>必要时自动变换数字为字符串，并且反过来也如此： </p>
<pre>mysql&gt; Select 1+&quot;1&quot;;
-&gt; 2
mysql&gt; Select CONCAT(2,' test');
-&gt; '2 test'
</pre>
<p>如果你想要明确地变换一个数字到一个字符串，把它作为参数传递到<code><font face="新宋体">CONCAT()</font></code>。 </p>
<p>如果字符串函数提供一个二进制字符串作为参数，结果字符串也是一个二进制字符串。被变换到一个字符串的数字被当作是一个二进制字符串。这仅影响比较。 </p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=204" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=204</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[[转载]php编码规范 ]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=21" label="PHP" /> 
	  <updated>2008-07-19T14:34:15+08:00</updated>
	  <published>2008-07-19T14:34:15+08:00</published>
		  <summary type="html"><![CDATA[<p><strong><img alt="" src="http://www.haixiait.com/attachments/month_0803/j200831216335.gif" border="0" /></strong></p>
<p><strong><font color="#0000ff">编码规范有如下好处：</font></strong></p>
<p><font color="#ff0000">1、有助于程序的维护，降低软件生命周期成本，符合项目管理的规律；<br />2、使团队中相关人员的流动对项目的影响尽可能小，有利于项目的控制与管理；<br />3、提高程序的可读性，有利于相关设计人员交流，提高软件质量；<br />4、有利于形成可管理，可重用的团队后备资源；<br />5、有利于软件工程相关产品元素的SCM；<br />6、这是程序设计人员的基本素质；<br />7、其它好处。</font></p>
<p>下面是我收集的一些PHP编码规范 by airzen </p>
<p><strong>缩进</strong></p>
<p>缩进使用4个空格，而不是 tab。如果你使用 Emacs 编辑 PEAR 代码，你应该设置 indent-tabs-mode 为 nil。下面是一个 mode hook 的示例，用于设置 Emacs 符合缩进标准（你必须确保在编辑 PHP 文件时，这些设置发生作用）：</p>
<p>&nbsp; (defun php-mode-hook ()<br />&nbsp; (setq tab-width 4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c-basic-offset 4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c-hanging-comment-ender-p nil<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; indent-tabs-mode<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (not<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (and (string-match &quot;/\\(PEAR\\|pear\\)/&quot; (buffer-file-name))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (string-match &quot;\.php$&quot; (buffer-file-name))))))</p>
<p>这里是同等效果的 vim 规则：</p>
<p>&nbsp; set expandtab<br />&nbsp; set shiftwidth=4<br />&nbsp; set softtabstop=4<br />&nbsp; set tabstop=4</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>控制结构</strong></p>
<p>控制结构包含 if、for、while、switch 等。这里有一个 if 语句的示例和一个 switch 语句的示例：</p>
<p>if 语句的示例：</p>
<p>&lt;?php<br />if ((condition1) || (condition2)) {<br />&nbsp;&nbsp;&nbsp; action1;<br />} elseif ((condition3) &amp;&amp; (condition4)) {<br />&nbsp;&nbsp;&nbsp; action2;<br />} else {<br />&nbsp;&nbsp;&nbsp; defaultaction;<br />}<br />?&gt;</p>
<p>switch 语句的示例：</p>
<p>&lt;?php<br />switch (condition) {<br />case 1:<br />&nbsp;&nbsp;&nbsp; action1;<br />&nbsp;&nbsp;&nbsp; break;<br />case 2:<br />&nbsp;&nbsp;&nbsp; action2;<br />&nbsp;&nbsp;&nbsp; break;<br />default:<br />&nbsp;&nbsp;&nbsp; defaultaction;<br />&nbsp;&nbsp;&nbsp; break;<br />}<br />?&gt;</p>
<p>控制语句应该在控制关键词和开始的圆括号之间应该有一个空格，以此和函数调用进行区别。</p>
<p>强烈建议你总是使用花括号将控制结构各部分标识出来。即使是在技术上可以不使用花括号的地方。这可以增加代码的可读性，同时避免在结构部分增加新行后引入逻辑上的错误。</p>
<p>原始代码：</p>
<p>if (condition)<br />&nbsp;&nbsp;&nbsp; return true;<br />else<br />&nbsp;&nbsp;&nbsp; return false;</p>
<p>修改后的代码：</p>
<p>if (condition)<br />&nbsp;&nbsp;&nbsp; do something; // 出现逻辑错误<br />&nbsp;&nbsp;&nbsp; return true;<br />else<br />&nbsp;&nbsp;&nbsp; return false;</p>
<p>正确的做法：</p>
<p>if (condition) {<br />&nbsp;&nbsp;&nbsp; do something;<br />&nbsp;&nbsp;&nbsp; return true;<br />} else {<br />&nbsp;&nbsp;&nbsp; return false;<br />}</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>函数调用</strong></p>
<p>调用函数时，函数名和开始的括号之间不应该有空白字符。参数和开始及结束的括号之间不应有空格。而除第一个参数外，其他参数都应该用一个空格分隔。这里有一个示例：</p>
<p>&lt;?php<br />$var = foo($bar, $baz, $quux);<br />?&gt;</p>
<p>像上面的示例代码，赋值运算等号两边都应该使用一个空格。如果是相关的赋值运算，应该采用下面的形式以提供更好的可读性：</p>
<p>&lt;?php<br />$short = foo($bar);<br />$long_variable = foo($baz);<br />?&gt;</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>函数定义</strong></p>
<p>按照&ldquo;one true brace&rdquo;约定声明函数：</p>
<p>&lt;?php<br />function fooFunction($arg1, $arg2 = '')<br />{<br />&nbsp;&nbsp;&nbsp; if (condition) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statement;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return $val;<br />}<br />?&gt;</p>
<p>&ldquo;one true brace&rdquo;约定就是开始的花括号单独占一行，而不是跟在其他语句后面。</p>
<p>具有默认值的参数应该位于参数列表的后面（事实上 PHP 语言定义也要求如此）。如果适合，函数应该总是返回一个有意义的值。这里有一个稍微长一点的示例：</p>
<p>&lt;?php<br />function connect(&amp;$dsn, $persistent = false)<br />{<br />&nbsp;&nbsp;&nbsp; if (is_array($dsn)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $dsninfo = &amp;$dsn;<br />&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $dsninfo = DB::parseDSN($dsn);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; if (!$dsninfo || !$dsninfo['phptype']) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return $this-&gt;raiseError();<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; return true;<br />}<br />?&gt;</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>注释</strong></p>
<p>类型（class）的联机文档应该符合 PHPDoc（类似于 JavaDoc）的约定。更多关于 PHPDoc 的信息可以访问 <a href="http://www.phpdoc.de/">http://www.phpdoc.de/</a> 获得。</p>
<p>此外，强烈鼓励使用非文档注释。一般性规则是对于那些容易忘记作用的代码添加简短的介绍性注释。</p>
<p>推荐使用 C 样式的注释（/* */）和标准 C++ 注释（//)，而不应该使用 Perl/shell 样式的注释（#）。</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>包含代码</strong></p>
<p>无论在什么地方无条件包含一个类型文件，应该使用 require_once()。如果有条件的包含一个类型文件（例如使用工厂方法），应该使用 include_once()。使用两者中的任何一个都能够确保类型文件只包含一次。它们共享一个文件列表，因此你不需要担心混淆他们 &mdash;&mdash; 一个文件使用 require_once() 包含后不会在 include_once() 中再一次被包含。</p>
<p>备注：include_once() 和 require_once() 是一个声明，而不是函数。你不需要使用圆括号将文件名扩起来（不过使用括号也不会出现错误）。</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>PHP 代码标记</strong></p>
<p>总是使用 &lt;?php ?&gt; 来界定 PHP 代码，而不要使用 &lt;? ?&gt; 速记方式。这是为了符合 PEAR 一致性所必须的，同时也是在不同操作系统和不同安装设置环境下移植 PHP 代码所要求的。</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>头注释块</strong></p>
<p>PEAR 发布的所有源代码文件头部都应该包含下面的注释块：</p>
<p>&lt;?php<br />/* vim: set expandtab tabstop=4 softtabstop=4 shiftwidth=4: */<br />// +----------------------------------------------------------------------+<br />// | PHP version 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// +----------------------------------------------------------------------+<br />// | Copyright (c) 1997-2002 The PHP Group&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// +----------------------------------------------------------------------+<br />// | This source file is subject to version 2.0 of the PHP license,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// | that is bundled with this package in the file LICENSE, and is&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// | available at through the world-wide-web at&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// | <a href="http://www.php.net/license/2_02.txt">http://www.php.net/license/2_02.txt</a>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// | If you did not receive a copy of the PHP license and are unable to&nbsp;&nbsp; |<br />// | obtain it through the world-wide-web, please send a note to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// |
<script language="JavaScript" type="text/javascript">
<!--
var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
var path = 'hr' + 'ef' + '=';
var addy20155 = 'l&#105;c&#101;ns&#101;' + '&#64;';
addy20155 = addy20155 + 'php' + '&#46;' + 'n&#101;t';
var addy_text20155 = 'l&#105;c&#101;ns&#101;' + '&#64;' + 'php' + '&#46;' + 'n&#101;t';
document.write( '<a ' + path + '\'' + prefix + ':' + addy20155 + '\'>' );
document.write( addy_text20155 );
document.write( '<\/a>' );
//-->\n </script>
<a href="http://www.haixiaIT.com/mailto:license@php.net">license@php.net</a> <a href="http://www.haixiaIT.com/mailto:license@php.net">license@php.net</a>
<script language="JavaScript" type="text/javascript">
<!--
document.write( '<span style=\'display: none;\'>' );
//-->
</script>
<span style="DISPLAY: none"><span style="DISPLAY: none">这个 E-mail 地址已经被防止灌水恶意程式保护，您需要激活 Java Script 才能观看
<script language="JavaScript" type="text/javascript">
<!--
document.write( '</' );
document.write( 'span>' );
//-->
</script>
</span></span>so we can mail you a copy immediately.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// +----------------------------------------------------------------------+<br />// | Authors: original Author &lt;
<script language="JavaScript" type="text/javascript">
<!--
var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
var path = 'hr' + 'ef' + '=';
var addy73126 = '&#97;&#117;th&#111;r' + '&#64;';
addy73126 = addy73126 + '&#101;x&#97;mpl&#101;' + '&#46;' + 'c&#111;m';
var addy_text73126 = '&#97;&#117;th&#111;r' + '&#64;' + '&#101;x&#97;mpl&#101;' + '&#46;' + 'c&#111;m';
document.write( '<a ' + path + '\'' + prefix + ':' + addy73126 + '\'>' );
document.write( addy_text73126 );
document.write( '<\/a>' );
//-->\n </script>
<a href="http://www.haixiaIT.com/mailto:author@example.com">author@example.com</a> <a href="http://www.haixiaIT.com/mailto:author@example.com">author@example.com</a>
<script language="JavaScript" type="text/javascript">
<!--
document.write( '<span style=\'display: none;\'>' );
//-->
</script>
<span style="DISPLAY: none"><span style="DISPLAY: none">这个 E-mail 地址已经被防止灌水恶意程式保护，您需要激活 Java Script 才能观看
<script language="JavaScript" type="text/javascript">
<!--
document.write( '</' );
document.write( 'span>' );
//-->
</script>
</span></span>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// | Your Name &lt;
<script language="JavaScript" type="text/javascript">
<!--
var prefix = '&#109;a' + 'i&#108;' + '&#116;o';
var path = 'hr' + 'ef' + '=';
var addy10296 = 'y&#111;&#117;' + '&#64;';
addy10296 = addy10296 + '&#101;x&#97;mpl&#101;' + '&#46;' + 'c&#111;m';
var addy_text10296 = 'y&#111;&#117;' + '&#64;' + '&#101;x&#97;mpl&#101;' + '&#46;' + 'c&#111;m';
document.write( '<a ' + path + '\'' + prefix + ':' + addy10296 + '\'>' );
document.write( addy_text10296 );
document.write( '<\/a>' );
//-->\n </script>
<a href="http://www.haixiaIT.com/mailto:you@example.com">you@example.com</a> <a href="http://www.haixiaIT.com/mailto:you@example.com">you@example.com</a>
<script language="JavaScript" type="text/javascript">
<!--
document.write( '<span style=\'display: none;\'>' );
//-->
</script>
<span style="DISPLAY: none"><span style="DISPLAY: none">这个 E-mail 地址已经被防止灌水恶意程式保护，您需要激活 Java Script 才能观看
<script language="JavaScript" type="text/javascript">
<!--
document.write( '</' );
document.write( 'span>' );
//-->
</script>
</span></span>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />// +----------------------------------------------------------------------+<br />//<br />// $ Id $<br />?&gt;</p>
<p>这里没有硬性规定要将一个代码贡献者的名字添加到文件注释的作者列表中。一般情况下，他们的更改属于&ldquo;substantial&rdquo;目录（意味大约10%到20%的代码被改写）。有一个例外就是代码贡献者重写了函数或者贡献了新的程序逻辑。</p>
<p>简单的代码重组和 bug 修复不应该增加新作者，这是不恰当的。</p>
<p>不在核心 PEAR 仓库中的文件应该有一个类似的注释块来说明版权、许可协议和作者。所有文件应该包含一个模式行（modeline，用于 vim 和 emacs）以确保一致性。</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>使用 CVS</strong></p>
<p>这个小节的内容仅仅适用于 cvs.php.net 上使用 CVS 的包。</p>
<p>在每一个文件中包含 $Id $（两个 $ 符号之间的关键字不能够有空格，但由于此文档也是用 CVS 管理，因此只好加个空格，避免被 CVS 替换掉） CVS 关键字，以便查看文件当前状态和最后修改时间等信息。如果已经存在&ldquo;Last Modified:&rdquo;这样的信息，则替换为 $Id $ 标记。</p>
<p>这个小节的其他内容假定你有关于 CVS 标记和分支（branches）的基本知识。</p>
<p>CVS 标记用于标识你包中的文件释放之前所作的修订。下面的列表是必需使用和建议使用的 CVS 标记：</p>
<p>RELEASE_n_n</p>
<p>（必需的）用于标记一个释放版本。如果你没有使用这个标记，别人就没有办法在你发布一个释放版本时从 CVS 服务器获取你的包。</p>
<p>QA_n_n</p>
<p>（分支，可选）如果你觉得在发布释放版本之前要提供一个候选释放版本，那么一个好主意就是增加一个分支。这个分支可以让你将释放版本隔离出来，并在正式发布释放版本之前可以为这些分支单独应用更新。期间，正常的开发工作可以在主干上继续进行。</p>
<p>MAINT_n_n</p>
<p>（分支，可选）如果你需要创建一个较小修改的释放版本（例如在 1.2 之后发布 1.2.1）。那么你可以创建一个分支来达到目的。</p>
<p>仅有 RELEASE 标记是必须的，其他标记为了方便推荐你使用。</p>
<p>下面是一个如何为 &quot;Money_Fast&quot; 包 1.2 释放版本增加标记的示例：</p>
<p>$ cd pear/Money_Fast<br />$ cvs tag RELEASE_1_2<br />T Fast.php<br />T README<br />T package.xml</p>
<p>经过上面的操作，就可以在 PEAR Web 网站上获取你的一系列释放版本了。</p>
<p>这里是一个如何建立 QA 分支的示例：</p>
<p>$ cvs tag QA_2_0_BP<br />...<br />$ cvs rtag -b -r QA_2_0_BP QA_2_0<br />$ cvs update -r QA_2_0<br />$ cvs tag RELEASE_2_0RC1<br />...and then the actual release, from the same branch:<br />$ cvs tag RELEASE_2_0</p>
<p>&quot;QA_2_0_BP&quot; 标记是一个 &quot;branch point&quot; 标记，用于标记分支的开始。总是用这样的标记来标明分支的开始是一个好主意。MAINT 分支可以使用 RELEASE 标记作为它的分支起点。</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>示例中的 URL</strong></p>
<p>所有示例中用到的 URL 地址都应该是 &quot;example.com&quot;、&quot;example.org&quot;、&quot;example.net&quot;。</p>
<p><br />--------------------------------------------------------------------------------</p>
<p><br /><strong>命名约定</strong></p>
<p>一般而言，class、函数和变量的名字应该总是能够描述让代码阅读者能够容易的知道这些代码的作用。</p>
<p>Classes</p>
<p>class 应该具有一个描述性的名字。可能时应该避免使用缩写。class 名字应该总是用一个大写字母开始。从 class 名字中也能够反映出 PEAR class 的层次。层次中的每个级别都用下划线进行分隔。好的 class 名字示例如下：</p>
<p>Log<br />Net_Finger<br />HTML_Upload_Error</p>
<p><strong>函数和方法</strong></p>
<p>函数和方法应该使用 &quot;studly caps&quot; 样式命名。函数应该将所在包的名字作为前缀，以避免与其他包的函数发生名字冲突。名字的受字母（前缀之后）应该是小写，每一个新单词应该以大写字母开头。下面是一些示例：</p>
<p>connect()<br />getData()<br />buildSomeWidget()<br />XML_RPC_serializeData()</p>
<p>私有 class 成员和属性（意味着 class 成员和属性只应该由同一个 class 中声明的成员使用。不过 PHP 并不支持强制性的私有命名空间）应该用一个下划线开头。示例：</p>
<p>_sort()<br />_initTree()<br />$this-&gt;_status</p>
<p><strong>常数</strong></p>
<p>常数应该总是全部使用大写字母命名，用下划线来分隔单词。常数名字的前缀应该使用大写的 class/包 名字。例如：DB:: 包使用的所有常数都已 DB_ 开头。</p>
<p><strong>全局变量</strong></p>
<p>如果你的包需要定义全局变量，那么应该用下划线跟上包的名字和另一个下划线作为开头。例如，PEAR 包使用一个全局变量名为 $_PEAR_destructor_object_list。</p>
<p>预定义的值 true、false 和 null</p>
<p>PHP 的内建值 true、false 和 null 必须全部用小写字母书写。</p>
<p>原文地址：<a href="http://www.openphp.cn/index.php/article/2/165/index.html">http://www.openphp.cn/index.php/article/2/165/index.html</a></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=203" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=203</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[jQuery之实现复选框全选/全不选/反选]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=7" label="Javascript" /> 
	  <updated>2008-07-11T13:24:51+08:00</updated>
	  <published>2008-07-11T13:24:51+08:00</published>
		  <summary type="html"><![CDATA[<p>页面javascript部分首先引用src = /path/jquery.js</p>
<p>&nbsp;//全选<br />&nbsp;function CheckedAll(){<br />&nbsp;&nbsp;$(':checkbox').attr('checked','checked');<br />&nbsp;}</p>
<p><br />&nbsp;//全不选<br />&nbsp;function CheckedNo(){<br />&nbsp;&nbsp;$(':checkbox').attr('checked','');<br />&nbsp;}</p>
<p><br />&nbsp;//反选<br />&nbsp;function CheckedRev(){<br />&nbsp;&nbsp;var arr = $(':checkbox');<br />&nbsp;&nbsp;for(var i=0;i&lt;arr.length;i++){<br />&nbsp;&nbsp;&nbsp;arr[i].checked = ! arr[i].checked;<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>-----body----------</p>
<p>&nbsp;&nbsp;&nbsp; &lt;input type=&quot;button&quot; name=&quot;btnCheckedAll&quot; value=&quot;全　选&quot; onclick=&quot;javascript:CheckedAll();&quot; /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type=&quot;button&quot; name=&quot;btnCheckedNo&quot; value=&quot;全不选&quot; onclick=&quot;javascript:CheckedNo();&quot; /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type=&quot;button&quot; name=&quot;btnCheckedRev&quot; value=&quot;反　选&quot; onclick=&quot;javascript:CheckedRev();&quot; /&gt; </p>
<p>看了是不是很简单呀。。</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=202" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=202</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[将PJBLOG增加相关日志功能]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=12" label="杂文烩萃" /> 
	  <updated>2008-07-10T22:44:46+08:00</updated>
	  <published>2008-07-10T22:44:46+08:00</published>
		  <summary type="html"><![CDATA[<p>今天在<a href="http://www.shuihan.com" target="_blank">水寒的博客</a>上转转，发现了这篇好文章，闲来无事，试验之，一试果然很爽。不敢独享，与大家一起分享.</p>
<p>&nbsp;</p>
<p>原文地址：<a href="http://www.shuihan.com/article.asp?id=313">http://www.shuihan.com/article.asp?id=313</a></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=201" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=201</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[轻松一下超经典骂人回答（只有一个字）]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=12" label="杂文烩萃" /> 
	  <updated>2008-07-10T10:33:34+08:00</updated>
	  <published>2008-07-10T10:33:34+08:00</published>
		  <summary type="html"><![CDATA[<p>甲刚更换了QQ头像</p>
<p>甲：&ldquo;看我的头像牛B不？&rdquo;</p>
<p>乙：&ldquo;像&rdquo;</p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=200" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=200</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[PHP常用字符串函数收集（60个）]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=21" label="PHP" /> 
	  <updated>2008-07-10T09:42:12+08:00</updated>
	  <published>2008-07-10T09:42:12+08:00</published>
		  <summary type="html"><![CDATA[<p>&nbsp;<img alt="" src="http://www.haixiait.com/attachments/month_0803/j200831216335.gif" border="0" /></p>
<p>1、AddcSlashes 字符串加入反斜线<br />语法：string addcslashes(string str,string charlist);<br /><br />2、AddSlashes 字符串加入反斜线<br />语法：string addslashes(string str);<br />在特定的字符前加反斜线：'、&quot;、\、NULL<br /><br />3、bin2hex 将二进位转成十六进位<br />语法：string bin2hex(string str);<br /><br /><strong>4、Chop 去除连续空白</strong><br />语法:string chop(string str);<br /><br />5、Chr Chr根据ASCII值返回字符<br />语法：string chr(int ascii);<br /><br />6、chunk_split 将字符串分成小段<br />语法：string chunk_split(string string,int [chunklen],string [end]);<br /><br />7、convert_cyr_string 字符串内码转换<br />语法：string convert_cyr_string(string str,string from,string to);<br /><br />8、count_chars 返回字符串的信息<br />语法：mixed count_chars(string string,[mode]);<br /><br /><strong>9、crypt 返回字符串用DES编码加密<br /></strong>语法：string crypt(string str,string [salt]);<br /><br />10、echo 显示内容<br />语法：echo(string arg1,string [argn].....);<br /><br />11、explode 切开字符串<br />语法：array explode(string separator,string string);<br /><br />12、flush 清除输出缓冲区<br />语法：oid flush(void);<br /><br />13、get_html_translation_table 返回函数htmlspecialchars()及htmlentites()的字符转换表<br />语法：string get_html_translation_table(int table);<br /><br />14、get_meta_tags 抽出档案所有meta标记的资料<br />语法：array get_meta_tags(string filename,int [use_include_path])<br /><br />15、htmlentities 将所有的字元都转民HTML字符串<br />语法：string htmlentities(string string);<br /><br />16、htmlspecialchars 将特殊字元转成HTML格式<br />语法：string htmlspecialchars(string string);<br /><br />17、implode 将数组变成字符串<br />语法：string implode(string glue,array pieces);<br /><br />18、join 将数组变成字符串<br />语法：string join(string glue,array,pieces);<br /><br />19、ltrim 去除连续空白<br />语法：string ltrim(string str);<br /><br /><strong>20、md5 使用MD5对字符串处理</strong><br />语法：string md5(string str);<br /><br />21、Metaphone 返回字符串的读音值<br />语法：string metaphome(string str);<br /><br />22、nl2br 将换行字元转成&lt;br&gt;<br />语法：string nl2br(string string);<br /><br />23、Ord 取得字符的ASCII码值<br />语法：int ord(string string);<br /><br />24、parse_str(string str);<br />语法：vid parse_str(string str)<br /><br />25、print 输出字符串<br />语法：print(string arg);<br /><br />26、printf 输出格式化字符串<br />语法：int printf(string format,mixed [args]...);<br /><br />27、quoted_printable_decode 将qp编码字符串转成八进制字符串<br /><br />28、QuoteMeta 特殊字符前加入反斜线<br /><br />29、rawurldecode 解码以URL方式编码的字符串<br />语法：string rawurldecode(string str);<br /><br />30、rawurlencode 将字符串编码成URL专用格式<br /><br />31、setlocale 设置本地信息<br />语法：string setlocale(string category,string locale);<br /><br />32、similar_text 计算字符串相似度<br />语法：int similar_text(string first,string second,double [percent]);<br /><br />33、soundex 返回字符串的读音值<br />语法：string soundex(string str);<br /><br />34、sprintf 将字符串格式化<br />语法：string sprintf(string format,mixed [args]...);<br /><br />35、strcasecmp 不区分大小写进行二进制方式的字符串比较<br />语法：int strcasecmp(string str1,string st2);<br /><br /><strong>36、strchr 寻找第一个出现的字符<br /></strong>语法：string strchr(string haystack,string needle);<br /><br /><strong>37、strcmp 区分大小写二进制方式的字符串比较<br /></strong>语法：int strcmp(string str1,string str2);<br /><br />38、strcspn 不同字符串的长度<br />语法：int strcspn(string str1,string st2);<br /><br />39、strip_tags 去掉HTML及PHP的标记<br />语法：string strip_tags(string str,string [allowable_tags]);<br /><br />40、stripcslashes 删除反斜线字符串<br />语法：string stripcslashes(string str);<br /><br />41、stripslashes 删除反斜线字符<br />语法：string stripslashes(string str);<br /><br />42、stristr 返回一个字符串在另一个字符串中出现以后的内容<br />语法：string stristr(string haystack,string needle);<br /><br />43、strlen 取得字符串的长度<br /><br /><strong>44、strpos 取得字符串中某字符最先出现的位置<br /></strong>语法：int strpos(string haystack,string needle,int [offset]);<br /><br /><strong>45、strrchr 取得某字符最后出现处起的字符串</strong><br />语法：string strrchr(string haystack,string needle);<br /><br /><strong>46、str_repet 重复一个字符串</strong><br />语法：str_repeat(string input,int multiplier);<br /><br />47、strrev 颠倒字符串<br />语法：string strrev(string string);<br /><br /><strong>48、strrpos 寻找字符串中某字符最后出现的位置</strong><br />语法：int strrpos(string haystack,char needle);<br /><br /><strong>49、strspn 计算一个字符串在另一个字符串中出现的数目</strong><br />语法：int strspn(string str1,string str2);<br /><br /><strong>50、strstr 返回一个字符串在另一个字符串中出现以后的内容</strong><br />语法：string strstr(string haystack,string needle);<br /><br />51、strtok 切开字符串<br />语法：string strtok(string arg1, string arg2);<br />以字符串arg2为分隔符,切开字符串arg1、arg2中可以放入多个分隔符。<br /><br />52、strtolower 字符串全转为小写<br />语法：string strtolower(string str);<br /><br />53、strtoupper 字符串全转为大写<br />语法：string strtoupper(string str);<br /><br />54、str_replace 字符串替换<br />语法：str_replace(string needle,string str,string haystack);<br />在字符串haystack中替换所有字符串str为needle。本函数可以使用ereg_replace()代替。<br /><br />55、strtr 字符串替换<br />语法：string strtr(string str, string from, string to);<br />字符替换，将字符串str中包含from字符的一一对应地换为to中的字符。如果from与to的字符数不相同，将忽略多出的字符，这个函数的替换是字符，而不是单词或字符串替换。<br /><br />56、substr 取部分字符串<br />语法：string substr(string string, int start, int [length]);<br /><br />57、substr_rreplace 字符串替换<br />语法：string substr_replace(string string,string replacement, int start, int [length]);<br />从string中提取字符串，并且以字符串replacement替换，参数start、length的定义及使用与subxstr相同。<br /><br />58、trim 截去字符串首尾的空格<br />语法：string trim(string str);<br /><br />59、ucfirst 将字符串第一个字符改为大写<br />语法：string ucfirst(string str);<br /><br />60、ucwords 将字符串每个单词第一个字母改大写<br />语法：string ucwords(string str);</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=199" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=199</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[你可能没有注意到的几个电脑使用小技巧]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=11" label="操作系统" /> 
	  <updated>2008-07-04T11:24:18+08:00</updated>
	  <published>2008-07-04T11:24:18+08:00</published>
		  <summary type="html"><![CDATA[<p>1、以Windows XP系统来说，按&ldquo;开始&rdquo;-&ldquo;运行&rdquo;，输入&ldquo;CMD&rdquo;回车后，再在DOS窗口下输入&ldquo;<strong>systeminfo</strong>&rdquo;命令，就可以查看到您的Windows XP出生日期了（指Windows XP初安装日期）。如果利用GHOST重装系统后，还是会以以前的时间为准。</p>
<p>除此之外，还可在此看到系统的所有信息，如主机名、处理器、网卡、以及系统打了多少补丁等等。是不是很有意思呢?</p>
<p>2、删除文件时，按<strong>shift 键</strong>可以直接删除。不经过回收站</p>
<p>3、稍微对计算机熟悉点的朋友，都知道CTRL+Z键是撤消键.</p>
<p>其实基本所有的大程序都是选择这个快捷键撤消键，包括计事本、IE浏览器等系统自带程序。</p>
<p>其实很多老鸟常常都犯了这样一个错误，在一些设计软件里都知道用这个键，可在一些菜单里没有撤消选项的软件里(比如IE)反而忘了有撤消这么个功能了.</p>
<p>我们用电脑写东西（例如在51群里发表帖子、qq聊天打字）时，可能都遇到过这样的事情，因为失误操作，不小心把刚刚写的字删除掉了，如果删除一两个字还可以重新打过，但如果是一大段的文字呢，这时只有干着急啊。其实，这时，我们只要按下CTRL+Z刚才不小心删除掉的东西就又会回来了。(朋友们可以做个测试，请在本帖后回帖的地方随意打一个字，再把这些字删除，然后再按CTRL+Z键，怎么样，这些字又回来了吧)</p>
<p>这里我只是举了最简单的一个例子，其实在很多时候，我们都可以通过CTRL+Z快捷键来实现，对刚刚误操作的恢复。</p>
<p>4、上网时在地址栏内输入网址，系统会记录下来，虽然方便以后不用再重复，不 过如果是公用的机子，又不想让别人知道自己到过哪些地方，可以用&ldquo;<strong>CTRL＋ O</strong>（字母O，不是0）&rdquo;，这时对弹出一个&ldquo;打开&rdquo;对话框，在其中的地址栏内 输入网址，就不会被记录下来了.</p>
<p>5、如果浏览的页面中应用了javascript禁用了鼠标右键，解决的方法：（1）、先按住鼠标左键，然后将鼠标移动到目标处，点击 鼠标右键，一两秒之后，快捷菜单出现.（2）、单击鼠标右键，（不要放开鼠标右键），将鼠标移到警告窗口处，点击鼠标 左键，关闭窗口，再将鼠标移回目标处，放开鼠标右键，快捷菜单出现.</p>
<p>6、系统文件检查器&mdash;&mdash;Sfc（system32文件夹下）</p>
<p>使用Windows难免不会出现系统文件损坏或丢失的毛病，而如果为了几个小小的文件就去重装系统，又显得稍微麻烦了一些。通过系统文件检查器Sfc.exe，一切都会变得非常简单。</p>
<p>7、关机、重启只要1秒钟<br />如果你想让Windows XP瞬间关机，那么可以按下CTRL+ALT+DEL，接着在弹出的任务管理器中点击&ldquo;关机&rdquo;&rarr;&ldquo;关机&rdquo;，与此同时按住CTRL，不到1秒钟你会发现系统已经关闭啦，简直就在眨眼之间。同样道理，如果在&ldquo;关机&rdquo;菜单中选择&ldquo;重启&rdquo;，即可快速重启。</p>
<p>8、快速拷贝文件<br />我们一般都是过一段时间就把硬盘上的文件分类整理一下，把图片放在picture文件夹中，<a title="mp3" href="http://mp3.pchome.net/" target="_blank"><font color="#0066cc">mp3</font></a>文件放在music文件夹中等等，但来回复制、粘贴真的很烦琐，现在让我们用一个简单的方法快速拷贝文件。选中一个文件夹如music，点鼠标右键创建一个快捷方式，复制这个快捷方式，在 C:＼Documents and Settings＼用户名＼SendTo文件夹中粘贴此快捷方式。<br />SendTo是WindowsXP的系统文件夹，&ldquo;发送到&rdquo;功能就是由它来实现的。现在我们选中任意一个mp3，点鼠标右键在发送到中选择&ldquo;快捷方式到 music&rdquo;，这个mp3文件就被复制到了music文件夹中，是不是很方便！我们还可以根据自己的需要制作software、txt等等。</p>
<p><strong>9、快速锁定计算机</strong><br />Winkey+L键即可快速锁定计算机。</p>
<p>10、简单一招，严禁迅雷偷偷上传！<br />每次使用迅雷下载东西，它都会生成一个文件：c:＼windows＼system32＼cid_store.dat<br />删除c:＼windows＼system32＼cid_store.dat文件，然后在c:＼windows＼system32＼目录下，新建一个文件夹，名称为 cid_store.dat，这样就没办法再生成任务记录文件啦，大功告成，简单吧</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=197" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=197</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[PHP批量的创建目录函数（支持相对和绝对目录的创建自动识别）]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=21" label="PHP" /> 
	  <updated>2008-06-26T11:39:18+08:00</updated>
	  <published>2008-06-26T11:39:18+08:00</published>
		  <summary type="html"><![CDATA[<img src="http://www.haixiait.com/attachments/month_0803/j200831216335.gif" border="0" alt=""/><br/><br/>今天在<a target="_blank" href="http://www.neatcn.com">飞天小肥猪的简单人生</a> 网站上看到了 <a target="_blank" href="http://www.neatcn.com/?action=show&amp;id=3">快速生成目录树</a> 的这个文章，发现只支持相对目录，嘿嘿拿过来改造了一下支持绝对目录的批量创建，啥也不说了，代码如下：<br/><br/><div class="UBBPanel"><div class="UBBTitle"><img src="http://www.haixiaIT.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>&lt;?php<br/>/*+-------------------------------------------------------------------------+<br/>功能：批量的创建目录(支持相对目录和绝对目录的创建)<br/>作者：airzen&nbsp;&nbsp;(www.<a href="http://www.haixiaIT.com" target="_blank">haixiaIT</a>.com)<br/>日期：20080626<br/>修改：<br/>+-------------------------------------------------------------------------+*/<br/>function mkdirs($path , $mode = 0755 ){<br/>&#160;&#160;&#160;&#160;$rootdir = &#39;&#39;;<br/>&#160;&#160;&#160;&#160;if(substr($path,0,1)==&#39;/&#39;) $rootdir = $_SERVER[&#39;DOCUMENT_ROOT&#39;] ;<br/>&#160;&#160;&#160;&#160;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$path = $rootdir . $path;<br/><br/>&#160;&#160;&#160;&#160;if(!is_dir($path)){<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mkdirs(dirname($path),$mode);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mkdir($path,$mode);<br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;return true;<br/>}<br/><br/><br/>//调用示例<br/><br/>//绝对路径的批量创建示例（站点根目录）<br/>mkdirs(&#39;/a/b/c/d&#39;);<br/>//相对路径的批量创建示例（当前脚本目录）<br/>mkdirs(&#39;1/2/3/4&#39;);<br/><br/><br/>?&gt;<br/></div></div><br/><br/><br/>希望能给大家的编程带来方便。]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=196" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=196</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[窥探jQuery]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=7" label="Javascript" /> 
	  <updated>2008-06-18T16:48:53+08:00</updated>
	  <published>2008-06-18T16:48:53+08:00</published>
		  <summary type="html"><![CDATA[<span style="COLOR: pink"><strong><font color="#0000ff">简介<br />Simon Willison来自英国，是一名经验丰富的开发人员。曾工作于Yahoo，是Web开发框架Django的创始人之一，也是OpenID的推动者。这是一篇针对jQuery的描述性文章，由于作者出色的分析，该文被引入jquery.com的教程库，对jQuery的推动有一定作用。英文版权归Simon Willison所有，中译文作者yangyang（aka davidkoree）。双语版可用于非商业传播，但须注明英文版作者、版权信息，以及中译文作者。翻译水平有限，请广大读者指正。</font></strong></span><br /><br /><br />当 jQuery 在2006年1月现身时，给我的第一印象，是这玩意儿构造得很精明。基于CSS选择器（CSS selectors）来打点一切，其思路相当灵巧（参考getElementsBySelector）。但链盒工事（chaining stuff）看起来更像个噱头，并且整体看来，jQuery库提供的功能并不能覆盖所有基础性的东西。因此我断定，jQuery只会昙花一现。<br /><br />几个月以来，我逐渐明白自己想错了。从技术工艺上考量，jQuery十分凌厉。它用简洁的方法，把大量常用功能封装起来，并提供精巧的插入式API，来满足标准库之外的功能模块的实现。jQuery秉持的核心，乃DOM元素的集合（译注：通常是某些子集合）&mdash;&mdash;它把元素集合作为一个根本，给高度抽象出来了。最重要的，是这种遵循最佳实践的抽象，能让jQuery与其他JavaScript代码相处融洽。<br /><br />很多对jQuery的介绍，都是针对设计师和初级开发人员。接下来我想说明，为什么jQuery也会吸引那些富有经验的开发人员。<br /><br />名称空间（Namespacing）<br /><br />编写可重用的、优秀的JavaScript代码，其关键在于对名称空间的积极把控。JavaScript只拥有单一的、全局的名称空间（即window对象），而很多程序员（以及一些库）恣意地为之添加各种东西。要知道全局变量是魔鬼！聪明的开发人员，会使用类似组件模式的技术，来尽力减少全局对象的数量。<br /><br />jQuery仅向全局名称空间引入一个标记：jQuery函数/对象。其余的要么是jQuery的直接属性（译注：原文&lsquo;directy property&rsquo;系笔误，应是&lsquo;direct property&rsquo;），要么就是调用jQuery函数所返回的对象的方法。<br /><br />那&ldquo;语言升级&rdquo;（language enhancements）又是什么呢？大多数库会提供映射，过滤，剥离，往往是浏览器的JavaScript引擎所缺少的那些功能。还有一些库，直接扩展了JavaScript内置的String和Array类，但这是冒险的做法。String.prototype和Array.prototype也有各自的名称空间，在其内添加的属性一旦发生冲突，所带来的风险，不亚于在全局环境下的草率大意。<br /><br />在语言升级方面，jQuery提供了很多函数（功能），但每个函数都被赋给jQuery对象的属性：jQuery.each，jQuery.extend，jQuery.grep，jQuery.map，jQuery.merge以及jQuery.trim。如此一来，它们就不会跟其他代码产生冲突。<br /><br />声名狼藉的$函数（The infamous $ function）<br /><br />刚才我说到，jQuery是唯一被引入的全局标记，其实并不尽然：$标记作为jQuery的快捷方式，也被引入进来。庆幸的是，$的存在不会带来负面影响：如果你需要让原始的$起死回生（比如，这之前你的代码使用了Prototype），你可以调用jQuery.noConflict()来恢复它。<br /><br />如果你既想拥有$的便利，又不希望jQuery跟其他同样使用了全局$函数的代码发生冲突，可遵循jQuery文档所建议的惯用方式：<br /><br /><br />(function($) {&nbsp;&nbsp;&nbsp;&nbsp;// 在这个函数体里，$可作为jQuery的引用&nbsp;&nbsp;&nbsp;&nbsp;// 很方便，对吧？})(jQuery);把一切都附加到$标记的做法，曾让我认为jQuery华而不实。不过，从体系的角度来审视这种设计，一切又是非常明了的&mdash;&mdash;尽管我常喜欢在代码中定义自己的$快捷方式。<br /><br />选取元素（Selecting some elements）<br /><br />jQuery的每个操作，都以选取DOM中一个或更多的节点（nodes）作为开始。jQuery（拥有一种真正的面向特定领域）的选取语法，是十分有趣的，它结合了CSS 1，CSS 2，部分CSS 3语法，一些XPath语法，以及一些特定的扩展。在这里我不会做详细介绍，我只列出几个有用的例子：<br /><br /><br />jQuery('div.panel')<br />选取了所有class=&quot;panel&quot;的div<br />jQuery('p#intro')<br />选取了所有id=&quot;intro&quot;的段落<br />jQuery('div#content a:visible')<br />选取了id=&quot;content&quot;的div中所有可见的链接<br />jQuery('input[@name=email]')<br />选取了所有name=&quot;email&quot;的输入域<br />jQuery('table.orders tr:odd')<br />选取了类名为&ldquo;orders&rdquo;的表中所有的奇数行<br /><br />jQuery('a[@href^=&quot;<a href="http:///" target="_blank">http://</a>&quot;]')<br />选取了所有（以<a href="http:///" target="_blank">http://</a>开头的）外部链接<br />jQuery('p[a]')<br />选取了所有包含一个或多个链接的段落<br /><br />上述例子中，:visible和:odd是jQuery实现的扩展，很具特色。而属性的选取使用@作为标记，其方式和XPath一样，要优于CSS 2。<br /><br /><br /><br /><br /><br />jQuery的这套选取语法包罗万象，有些类似正则表达式，想完全消化是需要花上一段时间的。<br /><br />把玩一下（Doing stuff with them）<br /><br />通过jQuery的选取操作，我们能得到一些很棒的&ldquo;素材&rdquo;（beast）。它们是一个集合，包含了DOM元素，并且类似数组那样，拥有length属性；通过索引可以访问集合中的元素。在Firebug console的交互模式下，集合也被显示成一个数组，这个特性非常有用。集合实际上是一个jQuery对象，这个对象被赋予了很多方法（methods），用来查询，修改，扩展集合中的元素。<br /><br />jQuery的方法（methods），本质上可分成三种：一种可以操作那些符合匹配的元素；一种可以返回第一个匹配到的对象的值；一种可以变更被选取的集合。<br /><br />我不会列出所有的方法（可参考visualjquery.com），但我用例子做一下说明。如果你的浏览器装了Firebug，你可以以交互方式运行这些示例代码：首先使用这个bookmarklet（译注[1]）把jQuery库载入至浏览器的任意页面，然后把示例代码粘贴到Firebug console中。<br /><br /><br />jQuery('div#primary').width(300);<br />把id=&quot;primary&quot;的div的宽度设为300px<br />jQuery('p').css('line-height', '1.8em');<br />把所有段落的line-height设为1.8em<br />jQuery('li:odd').css({color: 'white', backgroundColor: 'black'});<br />向间隔的list项添加两个CSS规则；注意css()函数可以用一个对象来代替两个字符串作为参数<br />jQuery('a[@href^=&quot;<a href="http:///" target="_blank">http://</a>&quot;]').addClass('external').attr('target', '_blank');<br />向所有（以<a href="http:///" target="_blank">http://</a>开头的）外部链接添加&ldquo;external&rdquo;类，然后策略性地加上target=&quot;_blank&quot;属性。这个示例用到了链盒（chaining），稍后会做介绍。<br />jQuery('blockquote').each(function(el) { alert(jQuery(this).text()) });<br />遍历页面上的每个&lt;blockquote&gt;，并显示出它的文字内容（包括HTML标签）<br />jQuery('a').html('Click here!');<br />用阴险的&ldquo;Click here!&rdquo;代替页面上所有的链接&lt;a&gt;的文字<br />下面的示例展示了jQuery如何取得第一个匹配到的对象的值：<br /><br /><br />var width = jQuery('div').width();<br />页面上第一个div的宽度<br />var src = jQuery('img').attr('src');<br />页面上第一张图片的src属性值<br />var color = jQuery('h1').css('color');<br />第一个&lt;h1&gt;的颜色样式值<br />在jQuery 的方法构造中，蕴含着令人惬意的对称性：当向方法传递两个参数或一个对象时，方法可被用来执行设置操作；如果只向方法传递一个参数，则可以让它执行取值操作（译注：读者可对照上面的示例代码感受一下）。这种对称性设计贯穿了jQuery体系，使得API的文法更容易被记忆。<br /><br />本节最后的例子，展示了一些可变更被选取的元素集合的方法。这些方法大多都提高了检索DOM的简易程度：<br /><br /><br />jQuery('div').not('[@id]')<br />返回那些没有id属性的div<br />jQuery('h2').parent()<br />返回那些是&lt;h2&gt;的直接父节点元素<br />jQuery('blockquote').children()<br />返回所有&lt;blockquote&gt;的子节点元素<br />jQuery('p').eq(4).next()<br />在页面上找到第五个段落（译注：因为集合的元素索引从0开始），然后根据节点的树层结构关系，找到并返回这个段落节点右侧的兄弟节点元素<br />jQuery('input:text:first').parents('form')<br />找到并返回页面上第一个type=&quot;text&quot;的输入域所在的form节点元素，parents()的可选参数是另一个选择器<br />链盒（Chaining）<br /><br />jQuery 开发团队经常夸耀jQuery的链盒理念（译注[2]），甚至在网站首页上宣扬&ldquo;jQuery将改变你编写JavaScript的方式&rdquo;。我个人感觉，这么做多少有点误导大众，我愿意告诉大家，你完全可以取jQuery之长，却应避免冗长的方法链盒（chains of methods）。<br /><br />也就是说，链盒有时会像变戏法一样。除了使用链盒将各种操作DOM的方法粘到一起，你也可以使用jQuery的end()方法，来实现在特定范围内推进或回溯你需要得到的元素。这个概念很难解释清楚。本质上讲，每次使用（诸如children()或filter()）方法来改变元素集合时，你可以在这些方法之后使用end()，来重新定位你最初选取的元素集合。关于这点，Jesse Skinner在他的Simplify Ajax development with jQuery（译注[3]）教程中给出了实例：<br /><br /><br />$('form#login')&nbsp;&nbsp;&nbsp;&nbsp;// 第一步，隐藏表单中那些带有'optional'类的&lt;label&gt;&nbsp;&nbsp;&nbsp;&nbsp;.find('label.optional').hide().end()&nbsp;&nbsp;&nbsp;&nbsp;// 第二步，为表单的密码输入域渲染上红色边框&nbsp;&nbsp;&nbsp;&nbsp;.find('input:password').css('border', '1px solid red').end()&nbsp;&nbsp;&nbsp;&nbsp;// 第三步，为表单加上提交处理&nbsp;&nbsp;&nbsp;&nbsp;.submit(function(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return confirm('Are you sure you want to submit?');&nbsp;&nbsp;&nbsp;&nbsp;});这个示例读起来就像句俏皮话。整个过程是，先选取一个表单，再在其中选取一些元素做修改，然后回溯到表单，为它定义一个submit()处理。<br /><br /><br /><br /><br /><br />示例很酷，但如果你不习惯，也可以不这么用。我就很乐意用自定义变量来规划代码。<br /><br /><br /><br /><br /><br />操作DOM（DOM Manipulation）<br /><br />jQuery提供了几个大规模操作DOM的卓越方法。第一种非常让人惊叹：jQuery()函数能把HTML片段插入DOM元素中（实际上，函数会留意以'&lt;'打头的字符串参数）：<br /><br /><br />var div = jQuery('&lt;div&gt;Some text&lt;/div&gt;');一旦你创建好了div，便可以继续用链盒向其添加属性：<br /><br /><br />var div = jQuery('&lt;div&gt;Some text&lt;/div&gt;').addClass('inserted').attr('id', 'foo');现在把div加到body上：<br /><br /><br />div.appendTo(document.body)或用选择器把div加到已知元素的前面：<br /><br /><br />div.prependTo('div#primary')处理事件（Handling events）<br /><br />任何JavaScript库都需要事件处理能力，jQuery也不例外。类似attr()和css()的行为，各种与事件处理相关的方法也有双重用途：一种是把函数当作参数，赋给事件处理器；一种是不带参数，可以模拟事件被触发（译注：前提是事件已经定义，可参考visualjquery.com &gt; Events &gt; click()）：<br /><br /><br />jQuery('p').click(function() { jQuery(this).css('background-color', 'red'); });<br />为所有段落增加点击事件，当你点击它们时，段落背景会变成红色<br />jQuery('p:first').click()<br />然后在第一个段落上模拟点击的动作，它的背景会变成红色<br /><br />类似的函数还包括mouseover，keyup等，对应着浏览器通常支持的那些动作。留意一下事件处理中的'this'关键字，它代表触发事件的元素；jQuery(this)是一种惯用语法，可以让this所代表的元素应用各种jQuery方法。<br /><br />这里有两个与事件相关的函数值得仔细说一下：<br /><br /><br />jQuery('a').hover(function() {&nbsp;&nbsp;&nbsp;&nbsp;jQuery(this).css('background-color', 'orange');}, function() {&nbsp;&nbsp;&nbsp;&nbsp;jQuery(this).css('background-color', 'white');});hover()可设定两个函数，分别对应onmouseover和onmouseout事件。<br /><br /><br />jQuery('p').one('click', function() { alert(jQuery(this).html()); });one()设定的事件在第一次被触发后便被移除。上面的示例会让所有段落在第一次被点击时显示其文字内容。<br /><br />凭借bind()和trigger()方法，jQuery也可以支持自定义事件（click()家族仅仅是便捷方法，只支持有限的事件）。自定义事件可接受参数，trigger()可接受数组作为参数，来做各种处理操作：<br /><br /><br />jQuery(document).bind('stuffHappened', function(event, msg) {&nbsp;&nbsp;&nbsp;&nbsp;alert('stuff happened: ' + msg);});jQuery(document).trigger('stuffHappened', ['Hello!']);渐进式编码（Unobtrusive scripting）<br /><br />本小节的标题很令我钟意。我一直认为，最好的Web应用程序，往往是那些在脚本被禁用后仍能正常使用的程序。想建立这样的应用程序，最好的方法就是遵循渐进式编码，让普通页面完全加载后，再为页面中的元素赋以事件处理（更多信息可参考渐进式编码和Hijax）。<br /><br />jQuery对这种编码策略提供了绝好支持。首先，从整体上看，节点选取暗合jQuery以及渐进式编码的核心理念。其次，针对window.onload问题，jQuery提供了一套解决方案，这套方案借鉴了Dean Edward的成果，使得以&ldquo;DOM加载完毕&rdquo;为信号的事件能跨浏览器工作。你可以在浏览器完全加载DOM后设定并运行一个函数，如下所示：<br /><br /><br />jQuery(document).ready(function() {&nbsp;&nbsp;&nbsp;&nbsp;alert('The DOM is ready!');});你甚至可以直接传递一个函数给jQuery()，以更简洁的方式达到同样效果：<br /><br /><br />jQuery(function() {&nbsp;&nbsp;&nbsp;&nbsp;alert('The DOM is ready!');});jQuery与Ajax（jQuery and Ajax）<br /><br />在我所知道的主流JavaScript库中，jQuery拥有最棒的Ajax API。最简单的Ajax调用如：<br /><br /><br />jQuery('div#intro').load('/some/fragment.html');代码以GET请求方式，从/some/fragment.html文件中获取HTML片段，并把片段装载到id=&quot;intro&quot;的div中。<br /><br />当我第一次看到这行代码时，几乎对它没什么印象。这看起来非常简洁，但如果你想用jQuery做些更复杂的事情，比如显示Ajax装载进度，该如何做呢？ jQuery为你准备了一些可自定义的事件（ajaxStart，ajaxComplete，ajaxError等等），来实现你想要的代码。同时 jQuery也提供了广泛的底层API，来实现更复杂的Ajax交互：<br /><br /><br />jQuery.get('/some/script.php', {'name': 'Simon'}, function(data) {&nbsp;&nbsp;&nbsp;&nbsp;alert('The server said: ' + data);}); // 以GET方式通过/some/script.php?name=Simon获取数据jQuery.post('/some/script.php', {'name': 'Simon'}, function(data) {&nbsp;&nbsp;&nbsp;&nbsp;alert('The server said: ' + data);}); // 以POST方式向/some/script.php发送请求jQuery.getJSON('/some.json', function(json) {&nbsp;&nbsp;&nbsp;&nbsp;alert('JSON rocks: ' + json.foo + ' ' + json.bar);}); // 从/some.json接收并解析数据，把数据转换成JSON格式jQuery.getScript('/script.js'); // 以GET方式获取/script.js脚本并用eval()执行插件（Plugins）<br /><br />就你所能获得的功能的数量而言，jQuery库其实是相当小的&mdash;&mdash;对代码做紧凑处理后只有20KB左右，甚至用gzip压缩后会变得更小。向标准库添加额外功能时，需用插件的方式来做，它可以（也确实能够）向现有的jQuery实例对象添加全新的方法。如果你想执行：<br /><br /><br />jQuery('p').bounceAroundTheScreenAndTurnGreen();jQuery的插件机制提供了文档说明型的挂载方式（documented hooks），可以实现把上述方法添加到jQuery中。这种简易的创建形式，吸引了很多插件作者，他们让人印象深刻；现在插件目录中已经有超过100个插件了。<br /><br />真正绝妙的，是你可以像自定义方法那样，来定义选择器。比如，moreSelectors插件实现了诸如&ldquo;div:color(red)&rdquo;的方法，来匹配包含红色文本的div。<br /><br />并非天衣无缝（Leaky abstractions）<br /><br />在发掘jQuery各种特性的同时，我也被某个我视之为教条（philosophical blocker）的东西所折磨着。几年来，我总是建议大家使用一种JavaScript库，前提是你们愿意梳理它的源码，并把它的工作原理彻底搞懂。我发出如此论调，是基于Joel Spolsky的不健全抽象的法则（译注[4]）。在那篇文章中，Joel指出，API把复杂性隐藏的越多，当它出现无法应付的意外时，你越有可能遭遇更多的麻烦。浏览器平台是不健全抽象的最佳代表，所以当库无法帮你摆脱困境时，你要自寻解药。保持警觉非常重要。<br /><br />jQuery 使用了相当不可思议的技术，以求实现它所设想的各种功能&mdash;&mdash;其中一些（比如选择器的代码）真是震天骇地。如果有必要彻底搞懂一个库的工作原理，那么对大多数开发人员来说，jQuery不会是上佳之选。然而，jQuery拥有极高的人气，并且没有太多与之相关的恐怖经典流于街巷（译注：原文是a distinct lack of horror stories，比如微软Win95的&ldquo;蓝屏&rdquo;就是恐怖经典:），所以具体到jQuery所用技艺的邪正之分，也就变得不那么重要了。<br /><br />我想，我必须重新审视曾给大家的建议。库的运作机制并不是问题焦点：关键是应看清更具普遍性的潜在问题，知晓浏览器之间的差别，以及你使用库的哪种技术，来消除差别造成的负面影响。没有哪种库可以一劳永逸地帮你克服浏览器的古怪行为。但只要你对应付潜在问题训练有素，便可把握经脉，指出问题的源头&mdash;&mdash;无论它们来自你自己编写的代码，还是库或者应付策略本身。<br /><br />结语（To conclude）<br /><br />我费了那么多口舌，希望能让大家明白，jQuery不只是又一个JavaScript库那么简单&mdash;&mdash;它蕴含了很多值得品味揣摩的理念，甚至能启迪那些骨灰级的JavaScript程序员。如果你不打算尝试jQuery，但仍值得去花些时间探索一下jQuery的生态体系（the jQuery ecosystem）。<br /><br />Simon Willison写于2007年8月15日 凌晨2:27<br /><br />译注：<br /><br />[1] bookmarklet在原文中指的是一段&ldquo;Insert jQuery&rdquo;的JavaScript代码，由于译者使用Google Docs进行在线翻译，链接中的JS代码被编辑器屏蔽掉了，下面列出的代码可粘贴到浏览器的地址栏中执行，执行后才可以继续用示例代码查看jQuery的选取效果：<br />javascript:void(function(){var s=document.createElement('script');s.src='<a href="http:///" target="_blank">http://</a>code.jquery.com/jquery-1.1.2.js';document.getElementsByTagName('head')[0].appendChild(s);}())<br /><br />[2] 本文使用的术语&ldquo;链盒&rdquo;，大抵可对应单词chain/chaining/chainable；译者在参考jQuery Magazine issue 1对jQuery 选择器运行方式的图解后，确定了这种译法。汉字是象形文字，按&ldquo;盒&rdquo;字的构造来体会jQuery颇有意趣：比如上面的&ldquo;人&rdquo;字，不正是选择器&ldquo;吐出&rdquo;特定元素的&ldquo;嘴&rdquo;吗？而&ldquo;人&rdquo;字下面&ldquo;一&rdquo;&ldquo;口&rdquo;&ldquo;皿&rdquo;的逐层累积，其形状又类似jQuery的Logo，并让人联想到链式选取过程中不同的元素集合；&ldquo;盒&rdquo; 即是&ldquo;桶&rdquo;（bucket），译者自以为绝妙！<br /><br />[3] IBM developerWorks中国的官方翻译版本《使用jQuery简化Ajax开发》；译言版本分1、2两部分，由令狐葱翻译。<br /><br />[4] Law of Leaky Abstractions: All non-trivial abstractions, to some degree, are leaky. 详细解读请见原文。<br />]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=195" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=195</id> 
  </entry>	
		
  <entry>
	  <title type="html"><![CDATA[看了这个图说说你的第一真实反应，不要装伪君子哦？]]></title>
	  <author>
		 <name>airzen</name>
		 <uri>http://www.haixiaIT.com/</uri>
		 <email>airzen@126.com</email>
	  </author>
	  <category term="" scheme="http://www.haixiaIT.com/default.asp?cateID=10" label="美图欣赏" /> 
	  <updated>2008-06-17T10:02:04+08:00</updated>
	  <published>2008-06-17T10:02:04+08:00</published>
		  <summary type="html"><![CDATA[<p><img alt="" src="http://www.haixiait.com/attachments/month_0806/o200861794658.jpg" /></p>
<p>今天我拍了一张门画，做为我的手机桌面。基本上百分之百的人包括MM和GG都这样说：&ldquo;你咋弄这么个图。真恶心&rdquo;，我都想不通了，现在人都整天在QQ上混，习惯了网络用语，竟然将民俗的东西也想的这么。。。。。</p>
<p>是不是我将他们俩放在一起就不会有误解了。哈哈。</p>
<p><img alt="" src="http://www.haixiait.com/attachments/month_0806/n200861710120.jpg" /><img alt="" src="http://www.haixiait.com/attachments/month_0806/o200861794658.jpg" /></p>
<p>看完后发表一下你的真实第一反应。<br /></p>]]></summary>
	  <link rel="alternate" type="text/html" href="http://www.haixiaIT.com/default.asp?id=194" /> 
	  <id>http://www.haixiaIT.com/default.asp?id=194</id> 
  </entry>	
		
</feed>