<?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>庆亮的博客-webgame架构 &#187; php</title>
	<atom:link href="http://www.qingliangcn.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.qingliangcn.com</link>
	<description>关注LAMP&#124;PHP源代码分析&#124;web架构&#124;PHP扩展&#124;Erlang&#124;服务端架构</description>
	<lastBuildDate>Fri, 10 Jun 2011 04:10:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>PHP源代码分析之HashTable</title>
		<link>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e4%bb%a3%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8bhashtable/</link>
		<comments>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e4%bb%a3%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8bhashtable/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 12:34:22 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[PHP内核与扩展]]></category>
		<category><![CDATA[HashTable]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=180</guid>
		<description><![CDATA[从PHP的zval结构体可以看出PHP使用HashTable来保存数组信息，PHP的HashTable使用了一些技巧，这些技巧是PHP高效数组操作的直接原因，源代码在PHP源代码目录的Zend/zend_hash.h&#160;&#160;Zend/zend_hash.c&#160;中。先来看看Zend&#160;HashTable的定义： 参数解释： nTableSize&#160;&#160;哈希表的大小 nTableMask&#160;&#160;数值上等于nTableSize&#160;-1&#160; nNumOfElements&#160;记录了当前HashTable中保存的记录数 nNextFreeElement&#160;&#160;指向下一个空闲的Bucket（之后有解释） pInternalPointer&#160; pListHead&#160;&#160;指向Bucket列表头部 pListTail&#160;&#160;&#160;&#160;指向Bucket列表尾部 arBuckets pDestructor&#160;&#160;&#160;一个函数指针，在HashTable发生增、删、改时自动调用，以完成某些清理工作。 persistent&#160;&#160;&#160;是否是持久 nApplyCount aApplyProtection 这两个参数用于放置在遍历时发生无限递归 &#160; &#160; 可以看到Bucket是一个双向链表，参数解释： h&#160;&#160;当元素使用数字索引时使用 nKeyLength&#160;&#160;当使用字符串索引时，该选项表示字符串索引的长度，而字符串则保存在Bucket结构体的最后一个元素arKey中。尽管arKey被声明为一个只有一个元素的数组，但是这并不妨碍我们在其中保存字符串，因为数组名可以看做指针，将arKey作为结构体的最后一个元素则Bucket结构体就成了变长结构体，而该变长结构体的长度则需要nKeyLength的辅助才能确定，这是C语言中的常见技巧。 pNext指向具有相同hash值的下一个bucket元素，无论HashTable设计的如何完美，冲突都是难免的。当采用字符串索引时，h成员变量存放的就是字符串索引的hash值。 pData指向保存的数据，如果数据本身又为指针，则用pDataPtr来保存对应的指针，而辞此时pData则指向自身结构体的pDataPtr。 接着看Zend&#160;HashTable的一些相关函数: #define&#160;HASH_PROTECT_RECURSION(ht) \ if&#160;((ht)-&#62;bApplyProtection)&#160;{ \ if&#160;((ht)-&#62;nApplyCount++&#160;&#62;=&#160;3)&#160;{ \ zend_error(E_ERROR,&#160;&#34;Nesting&#160;level&#160;too&#160;deep&#160;-&#160;recursive&#160;dependency?&#34;); \ } \ } 这个宏用于防止循环引用。 #define&#160;ZEND_HASH_IF_FULL_DO_RESIZE(ht) \ if&#160;((ht)-&#62;nNumOfElements&#160;&#62;&#160;(ht)-&#62;nTableSize)&#160;{ \ zend_hash_do_resize(ht); \ } 该宏用于判断HashTable中的元素是否超过了HashTable表的大小，如果超过则扩展HashTable的大小，查看zend_hash_do_resize的代码可以看到每次扩展大小都是成倍的。 看看Zend&#160;HashTable是如何初始化的 ZEND_API&#160;int&#160;_zend_hash_init(HashTable&#160;*ht,&#160;uint&#160;nSize,&#160;hash_func_t&#160;pHashFunction,&#160;dtor_func_t&#160;pDestructor,&#160;zend_bool&#160;persistent&#160;ZEND_FILE_LINE_DC) { uint&#160;i&#160;=&#160;3;&#160;//这里可以看出数组默认的初始化为8 Bucket&#160;**tmp; SET_INCONSISTENT(HT_OK);&#160;&#160;&#160;//&#160;用于调试&#160; if&#160;(nSize&#160;&#62;=&#160;0&#215;80000000)&#160;{ /*&#160;prevent&#160;overflow&#160;*/ ht-&#62;nTableSize&#160;=&#160;0&#215;80000000; }&#160;else&#160;{ while&#160;((1U&#160;&#60;&#60;&#160;i)&#160;&#60;&#160;nSize)&#160;{ i++; [...]]]></description>
			<content:encoded><![CDATA[<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">从<font face="Times New Roman">PHP</font><font face="宋体">的</font><font face="Times New Roman">zval</font><font face="宋体">结构体可以看出</font></span><span style="font-family: 'Times New Roman'; font-size: 10pt; mso-spacerun: 'yes'">PHP使用HashTable来保存数组信息，PHP的HashTable使用了一些技巧，这些技巧是PHP高效数组操作的直接原因，源代码在PHP源代码目录的Zend/zend_hash.h&nbsp;&nbsp;Zend/zend_hash.c&nbsp;中。先来看看Zend&nbsp;HashTable的定义：</span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 10pt; mso-spacerun: 'yes'"><img width="536" height="257" alt="" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1 (6).png" /></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 10pt; mso-spacerun: 'yes'"><span id="more-180"></span></span></p>
<p><span style="font-family: 'Times New Roman'; font-size: 10pt; mso-spacerun: 'yes'"></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">参数解释：</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">nTableSize&nbsp;&nbsp;<font face="宋体">哈希表的大小</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">nTableMask&nbsp;&nbsp;<font face="宋体">数值上等于</font><font face="Times New Roman">nTableSize&nbsp;-1&nbsp;</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">nNumOfElements&nbsp;<font face="宋体">记录了当前</font><font face="Times New Roman">HashTable</font><font face="宋体">中保存的记录数</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">nNextFreeElement&nbsp;&nbsp;<font face="宋体">指向下一个空闲的</font><font face="Times New Roman">Bucket</font><font face="宋体">（之后有解释）</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">pInternalPointer&nbsp;</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">pListHead&nbsp;&nbsp;<font face="宋体">指向</font><font face="Times New Roman">Bucket</font><font face="宋体">列表头部</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">pListTail&nbsp;&nbsp;&nbsp;&nbsp;<font face="宋体">指向</font><font face="Times New Roman">Bucket</font><font face="宋体">列表尾部</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">arBuckets</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">pDestructor&nbsp;&nbsp;&nbsp;<font face="宋体">一个函数指针，在</font><font face="Times New Roman">HashTable</font><font face="宋体">发生增、删、改时自动调用，以完成某些清理工作。</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">persistent&nbsp;&nbsp;&nbsp;<font face="宋体">是否是持久</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">nApplyCount</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">aApplyProtection 这两个参数用于放置在遍历时发生无限递归</span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt">&nbsp;</p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><img alt="" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1 (7).png" /></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt">&nbsp;</p>
<p><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">可以看到<font face="Times New Roman">Bucket</font><font face="宋体">是一个双向链表，参数解释：</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">h&nbsp;&nbsp;<font face="宋体">当元素使用数字索引时使用</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">nKeyLength&nbsp;&nbsp;<font face="宋体">当使用字符串索引时，该选项表示字符串索引的长度，而字符串则保存在</font><font face="Times New Roman">Bucket</font><font face="宋体">结构体的最后一个元素</font><font face="Times New Roman">arKey</font><font face="宋体">中。尽管</font><font face="Times New Roman">arKey</font><font face="宋体">被声明为一个只有一个元素的数组，但是这并不妨碍我们在其中保存字符串，因为数组名可以看做指针，将</font><font face="Times New Roman">arKey</font><font face="宋体">作为结构体的最后一个元素则</font><font face="Times New Roman">Bucket</font><font face="宋体">结构体就成了变长结构体，而该变长结构体的长度则需要</font><font face="Times New Roman">nKeyLength</font><font face="宋体">的辅助才能确定，这是</font><font face="Times New Roman">C</font><font face="宋体">语言中的常见技巧。</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">pNext<font face="宋体">指向具有相同</font><font face="Times New Roman">hash</font><font face="宋体">值的下一个</font><font face="Times New Roman">bucket</font><font face="宋体">元素，无论</font><font face="Times New Roman">HashTable</font><font face="宋体">设计的如何完美，冲突都是难免的。当采用字符串索引时，</font><font face="Times New Roman">h</font><font face="宋体">成员变量存放的就是字符串索引的</font><font face="Times New Roman">hash</font><font face="宋体">值。</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">pData<font face="宋体">指向保存的数据，如果数据本身又为指针，则用</font><font face="Times New Roman">pDataPtr</font><font face="宋体">来保存对应的指针，而辞此时</font><font face="Times New Roman">pData</font><font face="宋体">则指向自身结构体的</font><font face="Times New Roman">pDataPtr</font><font face="宋体">。</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">接着看<font face="Times New Roman">Zend&nbsp;HashTable</font><font face="宋体">的一些相关函数</font><font face="Times New Roman">:</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#define</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;HASH_PROTECT_RECURSION(ht)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((ht)-&gt;bApplyProtection)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((ht)-&gt;nApplyCount++&nbsp;&gt;=&nbsp;3)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_error(E_ERROR,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(163,21,21); font-size: 9pt; mso-spacerun: 'yes'">&quot;Nesting&nbsp;level&nbsp;too&nbsp;deep&nbsp;-&nbsp;recursive&nbsp;dependency?&quot;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">这个宏用于防止循环引用。</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#define</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;ZEND_HASH_IF_FULL_DO_RESIZE(ht)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((ht)-&gt;nNumOfElements&nbsp;&gt;&nbsp;(ht)-&gt;nTableSize)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_do_resize(ht);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">该宏用于判断<font face="Times New Roman">HashTable</font><font face="宋体">中的元素是否超过了</font><font face="Times New Roman">HashTable</font><font face="宋体">表的大小，如果超过则扩展</font><font face="Times New Roman">HashTable</font><font face="宋体">的大小，查看</font></span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_do_resize</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">的代码可以看到每次扩展大小都是成倍的。</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">看看<font face="Times New Roman">Zend&nbsp;HashTable</font><font face="宋体">是如何初始化的</font></span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ZEND_API&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">int</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;_zend_hash_init(HashTable&nbsp;*ht,&nbsp;uint&nbsp;nSize,&nbsp;hash_func_t&nbsp;pHashFunction,&nbsp;dtor_func_t&nbsp;pDestructor,&nbsp;zend_bool&nbsp;persistent&nbsp;ZEND_FILE_LINE_DC)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">uint&nbsp;i&nbsp;=&nbsp;3;</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;//<font face="宋体">这里可以看出数组默认的初始化为</font><font face="Times New Roman">8</font></span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">Bucket&nbsp;**tmp;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">SET_INCONSISTENT(HT_OK);</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;//&nbsp;<font face="宋体">用于调试&nbsp;</font></span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(nSize&nbsp;&gt;=&nbsp;0&#215;80000000)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">/*&nbsp;prevent&nbsp;overflow&nbsp;*/</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;nTableSize&nbsp;=&nbsp;0&#215;80000000;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">else</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">while</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((1U&nbsp;&lt;&lt;&nbsp;i)&nbsp;&lt;&nbsp;nSize)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">i++;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;nTableSize&nbsp;=&nbsp;1&nbsp;&lt;&lt;&nbsp;i;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;nTableMask&nbsp;=&nbsp;ht-&gt;nTableSize&nbsp;-&nbsp;1;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;pDestructor&nbsp;=&nbsp;pDestructor;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;arBuckets&nbsp;=&nbsp;NULL;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;pListHead&nbsp;=&nbsp;NULL;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;pListTail&nbsp;=&nbsp;NULL;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;nNumOfElements&nbsp;=&nbsp;0;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;nNextFreeElement&nbsp;=&nbsp;0;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;pInternalPointer&nbsp;=&nbsp;NULL;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;persistent&nbsp;=&nbsp;persistent;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;nApplyCount&nbsp;=&nbsp;0;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;bApplyProtection&nbsp;=&nbsp;1;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">/*&nbsp;Uses&nbsp;ecalloc()&nbsp;so&nbsp;that&nbsp;Bucket*&nbsp;==&nbsp;NULL&nbsp;*/</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(persistent)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">tmp&nbsp;=&nbsp;(Bucket&nbsp;**)&nbsp;calloc(ht-&gt;nTableSize,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">sizeof</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(Bucket&nbsp;*));</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(!tmp)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;FAILURE;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;arBuckets&nbsp;=&nbsp;tmp;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">else</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">tmp&nbsp;=&nbsp;(Bucket&nbsp;**)&nbsp;ecalloc_rel(ht-&gt;nTableSize,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">sizeof</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(Bucket&nbsp;*));</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(tmp)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;arBuckets&nbsp;=&nbsp;tmp;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;SUCCESS;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">可以看到<font face="Times New Roman">HashTable</font><font face="宋体">的大小被自动的初始化为</font><font face="Times New Roman">2</font><font face="宋体">的</font><font face="Times New Roman">n</font><font face="宋体">次方，</font></span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">persistent</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">参数用于指示是否是&ldquo;永久&rdquo;方式分配内存，如果是则采用系统分配内存方法，否则采用<font face="Times New Roman">ZendMM</font><font face="宋体">的内存分配方式，关于</font><font face="Times New Roman">ZendMM</font><font face="宋体">请搜索</font></span><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 9pt; font-weight: bold; mso-spacerun: 'yes'">PHP<font face="宋体">内存管理</font></span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">的相关内容。</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">申请得到的<font face="Times New Roman">bucket</font><font face="宋体">指针内存块都放在</font><font face="Times New Roman">HashTable</font><font face="宋体">的</font><font face="Times New Roman">arBucket</font><font face="宋体">中，可以把这段内存块看成一个数组，数组中的每个元素都指向一个实际的</font><font face="Times New Roman">bucket</font><font face="宋体">。</font></span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ZEND_API&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">int</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;_zend_hash_add_or_update(HashTable&nbsp;*ht,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">char</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;*arKey,&nbsp;uint&nbsp;nKeyLength,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">void</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;*pData,&nbsp;uint&nbsp;nDataSize,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">void</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;**pDest,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">int</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;flag&nbsp;ZEND_FILE_LINE_DC)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ulong&nbsp;h;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">uint&nbsp;nIndex;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">Bucket&nbsp;*p;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">IS_CONSISTENT(ht);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(nKeyLength&nbsp;&lt;=&nbsp;0)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;ZEND_DEBUG</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ZEND_PUTS(</span><span style="font-family: 'Times New Roman'; color: rgb(163,21,21); font-size: 9pt; mso-spacerun: 'yes'">&quot;zend_hash_update:&nbsp;Can&#8217;t&nbsp;put&nbsp;in&nbsp;empty&nbsp;key\n&quot;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#endif</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;FAILURE;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//根据索引值和索引长度生成hash值</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">h&nbsp;=&nbsp;zend_inline_hash_func(arKey,&nbsp;nKeyLength);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//用hash值和nTableMask进行按位于运算，用于索引的快速定位</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//按位于后的结果不可能大于nTableMask的值</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//结合下面的代码，可以看出这段代码的巧妙</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">nIndex&nbsp;=&nbsp;h&nbsp;&amp;&nbsp;ht-&gt;nTableMask;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">p&nbsp;=&nbsp;ht-&gt;arBuckets[nIndex];</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//如果p不为NULL，则产生了hash冲突</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">while</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(p&nbsp;!=&nbsp;NULL)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((p-&gt;h&nbsp;==&nbsp;h)&nbsp;&amp;&amp;&nbsp;(p-&gt;nKeyLength&nbsp;==&nbsp;nKeyLength))&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(!memcmp(p-&gt;arKey,&nbsp;arKey,&nbsp;nKeyLength))&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(flag&nbsp;&amp;&nbsp;HASH_ADD)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;FAILURE;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">HANDLE_BLOCK_INTERRUPTIONS();</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;ZEND_DEBUG</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(p-&gt;pData&nbsp;==&nbsp;pData)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ZEND_PUTS(</span><span style="font-family: 'Times New Roman'; color: rgb(163,21,21); font-size: 9pt; mso-spacerun: 'yes'">&quot;Fatal&nbsp;error&nbsp;in&nbsp;zend_hash_update:&nbsp;p-&gt;pData&nbsp;==&nbsp;pData\n&quot;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">HANDLE_UNBLOCK_INTERRUPTIONS();</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;FAILURE;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#endif</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//到了这里就说明是更新操作</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//先调用原来的析构函数执行清理</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(ht-&gt;pDestructor)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;pDestructor(p-&gt;pData);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">UPDATE_DATA(ht,&nbsp;p,&nbsp;pData,&nbsp;nDataSize);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(pDest)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">*pDest&nbsp;=&nbsp;p-&gt;pData;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">HANDLE_UNBLOCK_INTERRUPTIONS();</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;SUCCESS;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">p&nbsp;=&nbsp;p-&gt;pNext;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">//来到这里说明是增加元素操作</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">p&nbsp;=&nbsp;(Bucket&nbsp;*)&nbsp;pemalloc(</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">sizeof</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(Bucket)&nbsp;-&nbsp;1&nbsp;+&nbsp;nKeyLength,&nbsp;ht-&gt;persistent);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(!p)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;FAILURE;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">memcpy(p-&gt;arKey,&nbsp;arKey,&nbsp;nKeyLength);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">p-&gt;nKeyLength&nbsp;=&nbsp;nKeyLength;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">INIT_DATA(ht,&nbsp;p,&nbsp;pData,&nbsp;nDataSize);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">p-&gt;h&nbsp;=&nbsp;h;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">CONNECT_TO_BUCKET_DLLIST(p,&nbsp;ht-&gt;arBuckets[nIndex]);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(pDest)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">*pDest&nbsp;=&nbsp;p-&gt;pData;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">HANDLE_BLOCK_INTERRUPTIONS();</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">CONNECT_TO_GLOBAL_DLLIST(p,&nbsp;ht);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;arBuckets[nIndex]&nbsp;=&nbsp;p;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">HANDLE_UNBLOCK_INTERRUPTIONS();</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ht-&gt;nNumOfElements++;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ZEND_HASH_IF_FULL_DO_RESIZE(ht);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'">/*&nbsp;If&nbsp;the&nbsp;Hash&nbsp;table&nbsp;is&nbsp;full,&nbsp;resize&nbsp;it&nbsp;*/</span><span style="font-family: 'Times New Roman'; color: rgb(0,128,0); font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;SUCCESS;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">看到这里就可以发现多数代码都是类似的了，</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#define</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;CONNECT_TO_BUCKET_DLLIST(element,&nbsp;list_head)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(element)-&gt;pNext&nbsp;=&nbsp;(list_head);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(element)-&gt;pLast&nbsp;=&nbsp;NULL;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((element)-&gt;pNext)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(element)-&gt;pNext-&gt;pLast&nbsp;=&nbsp;(element);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">这个宏用于将一个<font face="Times New Roman">bucket</font><font face="宋体">加入到</font><font face="Times New Roman">bucket</font><font face="宋体">链表中</font></span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#define</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;CONNECT_TO_GLOBAL_DLLIST(element,&nbsp;ht)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(element)-&gt;pListLast&nbsp;=&nbsp;(ht)-&gt;pListTail;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(ht)-&gt;pListTail&nbsp;=&nbsp;(element);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(element)-&gt;pListNext&nbsp;=&nbsp;NULL;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((element)-&gt;pListLast&nbsp;!=&nbsp;NULL)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(element)-&gt;pListLast-&gt;pListNext&nbsp;=&nbsp;(element);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;(!(ht)-&gt;pListHead)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(ht)-&gt;pListHead&nbsp;=&nbsp;(element);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((ht)-&gt;pInternalPointer&nbsp;==&nbsp;NULL)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(ht)-&gt;pInternalPointer&nbsp;=&nbsp;(element);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">该宏用于将一个<font face="Times New Roman">bucket</font><font face="宋体">加入到</font><font face="Times New Roman">HashTable</font><font face="宋体">的链表中</font></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt">&nbsp;</p>
<p><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><font face="宋体"></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">下面列出<font face="Times New Roman">zend&nbsp;</font><font face="宋体">封装好的函数或者宏：</font></span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_add_empty_element</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;给数组增加一个空元素</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_do_resize</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;扩大哈希表的大小</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">_zend_hash_index_update_or_next_insert</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;插入或者更新指定数字索引的元素</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_del_key_or_index</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;根据索引删除<font face="Times New Roman">HashTable</font><font face="宋体">中的元素</font></span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_apply</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;遍历<font face="Times New Roman">HashTable</font><font face="宋体">，注意当中使用了两个宏</font></span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">HASH_PROTECT_RECURSION</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;和&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">HASH_UNPROTECT_RECURSION</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">来防止遍历陷入死循环。</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#define</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;HASH_PROTECT_RECURSION(ht)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((ht)-&gt;bApplyProtection)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((ht)-&gt;nApplyCount++&nbsp;&gt;=&nbsp;3)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_error(E_ERROR,&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(163,21,21); font-size: 9pt; mso-spacerun: 'yes'">&quot;Nesting&nbsp;level&nbsp;too&nbsp;deep&nbsp;-&nbsp;recursive&nbsp;dependency?&quot;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">#define</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;HASH_UNPROTECT_RECURSION(ht)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">if</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;((ht)-&gt;bApplyProtection)&nbsp;{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">(ht)-&gt;nApplyCount&#8211;;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"> </span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">\</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_reverse_apply</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;反向遍历<font face="Times New Roman">HashTable</font></span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_copy</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;拷贝</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">_zend_hash_merge</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;合并</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_find</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;字符串索引方式查找</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_index_find</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;数值索引方法查找</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_quick_find</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;上面两个函数的封装</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_exists</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;是否存在索引</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_index_exists</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;是否存在索引</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">zend_hash_quick_exists</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;&nbsp;上面两个方法的封装</span><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">ZEND_API&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">int</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;zend_hash_num_elements(HashTable&nbsp;*ht)</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">{</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">IS_CONSISTENT(ht);</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 9pt; mso-spacerun: 'yes'">return</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">&nbsp;ht-&gt;nNumOfElements;</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Times New Roman'; font-size: 9pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">获得数组大小</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">为了更加方便的操作HashTable，Zend将上面的宏做了进一步的封装。</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'"><img width="577" height="468" alt="" src="http://www.nd21.com/blog2/blog2/uploads/php_hash_table_hong.png" /></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">（上述内容截自 <a href="http://devzone.zend.com/node/view/id/1022#Heading5">http://devzone.zend.com/node/view/id/1022#Heading5</a>）</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 9pt; mso-spacerun: 'yes'">呵呵，非常方便的操作数组的方式。</span></p>
<p><!--EndFragment--></font></span><!--EndFragment--></span><!--EndFragment--></span><!--EndFragment--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e4%bb%a3%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8bhashtable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP源代码分析之变量</title>
		<link>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e4%bb%a3%e7%a0%81%e4%b9%8b%e5%8f%98%e9%87%8f/</link>
		<comments>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e4%bb%a3%e7%a0%81%e4%b9%8b%e5%8f%98%e9%87%8f/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 08:06:24 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[PHP内核与扩展]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zval]]></category>
		<category><![CDATA[内核]]></category>
		<category><![CDATA[变量]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=165</guid>
		<description><![CDATA[在PHP中所有变量都使用zval结构体来存放： &#160; 在PHP中可以使用函数&#160;debug_zval_dump($var);&#160;查看变量的引用信息。 &#160;相对于PHP的内核而已，我们编写的PHP代码都属于&#8220;用户空间&#8221;(user space)，用户空间中的任何PHP变量都是由两部分组成：变量名(label)和变量值，从上面已经看到变量值存放在zval结构体中，那么变量名是放在哪里的呢？ 下篇将继续分析PHP的HashTable结构体。 说明：本文中的图片均截自Marcus B&#246;rgerWez， FurlongSara， Golemon 三人的PHP ENTENSION WRITING （OSCON 2007） 在PHP&#160;5.2.6中源码稍有不同，不过含义一样，无关大雅。 &#160; refcount用来表示有多少个变量指向本结构体，is_ref用来标示是否是引用。看两个例子： $a&#160;=&#160;5; $b&#160;=&#160;$a; $b&#160;=&#160;10; &#160; $a&#160;=&#160;5&#160;&#160;&#160;=&#62;&#160;&#160;value.lval&#160;=&#160;5,&#160;refcount&#160;=&#160;1,&#160;type&#160;=&#160;IS_LONG,&#160;is_ref&#160;=&#160;0 $b&#160;=&#160;$a&#160;&#160;=&#62;&#160;&#160;value.lval&#160;=&#160;5,&#160;refcount&#160;=&#160;2,&#160;type&#160;=&#160;IS_LONG,&#160;is_ref&#160;=&#160;0 $b&#160;=&#160;10&#160;&#160;=&#62;&#160;&#160;1&#160;&#160;value.lval&#160;=&#160;5,&#160;refcount&#160;=&#160;1,&#160;type&#160;=&#160;IS_LONG,&#160;is_ref&#160;=&#160;0&#160;&#160;&#160;$a &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;2&#160;&#160;value.lval&#160;=&#160;10,&#160;refcount&#160;=&#160;1,&#160;type&#160;=&#160;IS_LONG,&#160;is_ref&#160;=&#160;0&#160;&#160;&#160;$b &#160; 在第三步时，PHP又产生了一个新的结构体用于保存变量$b，&#160;原因在于原来$b指向的结构体的is_ref&#160;成员的值为0.&#160;这就是PHP的Copy&#160;on&#160;Write机制。 &#160; 再看下一种情况： &#160; $a&#160;=&#160;123; $b&#160;=&#160;&#38;$a; $b&#160;=&#160;456; &#160; 则按下图保存]]></description>
			<content:encoded><![CDATA[<p><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">在<font face="Times New Roman">PHP</font><font face="宋体">中所有变量都使用</font><font face="Times New Roman">zval</font><font face="宋体">结构体来存放：</font></span></p>
<p><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><font face="宋体"><img alt="" width="577" height="454" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1 (4).png" /></font></span></p>
<p><p>&nbsp;</p>
<p><img alt="" width="422" height="400" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1 (5).png" /></p>
<p class="p0" style="margin-top: 5pt; margin-bottom: 5pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">在<font face="Times New Roman">PHP</font><font face="宋体">中可以使用函数</font></span><span style="font-family: 'Times New Roman'; color: rgb(128,128,128); font-size: 10.5pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,255); font-size: 10.5pt; mso-spacerun: 'yes'">debug_zval_dump</span><span style="font-family: 'Times New Roman'; color: rgb(128,128,0); font-size: 10.5pt; mso-spacerun: 'yes'">(</span><span style="font-family: 'Times New Roman'; color: rgb(0,0,139); font-size: 10.5pt; mso-spacerun: 'yes'">$var</span><span style="font-family: 'Times New Roman'; color: rgb(128,128,0); font-size: 10.5pt; mso-spacerun: 'yes'">)</span><span style="font-family: 'Times New Roman'; color: rgb(128,128,128); font-size: 10.5pt; mso-spacerun: 'yes'">;&nbsp;</span><span style="font-family: 'Times New Roman'; font-size: 10pt; mso-spacerun: 'yes'">查看变量的引用信息。</span><span style="font-family: 'Times New Roman'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p>&nbsp;相对于PHP的内核而已，我们编写的PHP代码都属于&ldquo;用户空间&rdquo;(user space)，用户空间中的任何PHP变量都是由两部分组成：变量名(label)和变量值，从上面已经看到变量值存放在zval结构体中，那么变量名是放在哪里的呢？ 下篇将继续分析PHP的HashTable结构体。</p>
<p><span style="color: #ff0000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><font face="宋体">说明：本文中的图片均截自Marcus B&ouml;rgerWez， FurlongSara， Golemon 三人的PHP ENTENSION WRITING （OSCON 2007）</font></span></span></p>
</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">在<font face="Times New Roman">PHP&nbsp;5.2.6</font><font face="宋体">中源码稍有不同，不过含义一样，无关大雅。</font></span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p><span style="color: #000000"></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">refcount<font face="宋体">用来表示有多少个变量指向本结构体，</font><font face="Times New Roman">is_ref</font><font face="宋体">用来标示是否是引用。看两个例子：</font></span></p>
<p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$a&nbsp;=&nbsp;5;</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$b&nbsp;=&nbsp;$a;</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$b&nbsp;=&nbsp;10;</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p><span style="color: #000000"></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$a&nbsp;=&nbsp;5&nbsp;&nbsp;&nbsp;=&gt;&nbsp;&nbsp;value.lval&nbsp;=&nbsp;5,&nbsp;refcount&nbsp;=&nbsp;1,&nbsp;type&nbsp;=&nbsp;IS_LONG,&nbsp;is_ref&nbsp;=&nbsp;0</span></p>
<p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$b&nbsp;=&nbsp;$a&nbsp;&nbsp;=&gt;&nbsp;&nbsp;value.lval&nbsp;=&nbsp;5,&nbsp;refcount&nbsp;=&nbsp;2,&nbsp;type&nbsp;=&nbsp;IS_LONG,&nbsp;is_ref&nbsp;=&nbsp;0</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$b&nbsp;=&nbsp;10&nbsp;&nbsp;=&gt;&nbsp;&nbsp;1&nbsp;&nbsp;value.lval&nbsp;=&nbsp;5,&nbsp;refcount&nbsp;=&nbsp;1,&nbsp;type&nbsp;=&nbsp;IS_LONG,&nbsp;is_ref&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;$a</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;value.lval&nbsp;=&nbsp;10,&nbsp;refcount&nbsp;=&nbsp;1,&nbsp;type&nbsp;=&nbsp;IS_LONG,&nbsp;is_ref&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;$b</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p><span style="color: #000000"></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">在第三步时，<font face="Times New Roman">PHP</font><font face="宋体">又产生了一个新的结构体用于保存变量</font><font face="Times New Roman">$b</font><font face="宋体">，&nbsp;原因在于原来</font><font face="Times New Roman">$b</font><font face="宋体">指向的结构体的</font><font face="Times New Roman">is_ref&nbsp;</font><font face="宋体">成员的值为</font><font face="Times New Roman">0.&nbsp;</font><font face="宋体">这就是</font><font face="Times New Roman">PHP</font><font face="宋体">的</font><font face="Times New Roman">Copy&nbsp;on&nbsp;Write</font><font face="宋体">机制。</font></span></p>
<p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p><span style="color: #000000"></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">再看下一种情况：</span></p>
<p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p><span style="color: #000000"></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$a&nbsp;=&nbsp;123;</span></p>
<p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$b&nbsp;=&nbsp;&amp;$a;</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="color: #000000"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">$b&nbsp;=&nbsp;456;</span></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
<p><span style="color: #000000"></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">则按下图保存</span></p>
<p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e4%bb%a3%e7%a0%81%e4%b9%8b%e5%8f%98%e9%87%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP源代码分析之PHP生命周期</title>
		<link>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8bphp%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f/</link>
		<comments>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8bphp%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 07:35:38 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[PHP内核与扩展]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[源代码]]></category>
		<category><![CDATA[生命周期]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=163</guid>
		<description><![CDATA[无论PHP通过何种方式启动，其初始化、响应单个请求、代码编译运行、结束请求、卸载过程都是相同的。 &#160; 1.进程初始化 在模块的MINIT过程中可以添加你自定义的常量、变量、类、资源、流以及Filter句柄等等。 2.接受请求 &#160; 3.解析编译运行代码 Zend&#160;Engine首先将代码编译成Zend&#160;Opcode，然后再使用Zend虚拟机来解释执行。 4.请求结束 5.进程退出 &#160; &#160;]]></description>
			<content:encoded><![CDATA[<p class="p0" style="margin-top: 0pt; text-indent: 36pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">无论<font face="Times New Roman">PHP</font><font face="宋体">通过何种方式启动，其初始化、响应单个请求、代码编译运行、结束请求、卸载过程都是相同的。</font></span></p>
<p class="p0" style="margin-top: 0pt; text-indent: 36pt; margin-bottom: 0pt">&nbsp;</p>
<p class="p0" style="margin-top: 0pt; text-indent: 36pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">1.</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">进程初始化</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><img alt="" width="386" height="183" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1.png" /></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">在模块的<font face="Times New Roman">MINIT</font><font face="宋体">过程中可以添加你自定义的常量、变量、类、资源、流以及</font><font face="Times New Roman">Filter</font><font face="宋体">句柄等等。</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">2.</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">接受请求</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><img alt="" width="564" height="133" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1 (1).png" /></span>&nbsp;</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">3.</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">解析编译运行代码</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">Zend&nbsp;Engine<font face="宋体">首先将代码编译成</font><font face="Times New Roman">Zend&nbsp;Opcode</font><font face="宋体">，然后再使用</font><font face="Times New Roman">Zend</font><font face="宋体">虚拟机来解释执行。</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">4.</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">请求结束</span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><img alt="" width="428" height="70" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1 (2).png" /></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">5.</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">进程退出</span></span></p>
<p>&nbsp;<span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><img alt="" width="577" height="75" src="http://www.nd21.com/blog2/blog2/uploads/php_lift_cycle_1 (3).png" /></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt">&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2009/07/php%e6%ba%90%e7%a0%81%e5%88%86%e6%9e%90%e4%b9%8bphp%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP中memcache扩展set失败的解决</title>
		<link>http://www.qingliangcn.com/2009/07/php%e4%b8%admemcache%e6%89%a9%e5%b1%95set%e5%a4%b1%e8%b4%a5%e7%9a%84%e8%a7%a3%e5%86%b3/</link>
		<comments>http://www.qingliangcn.com/2009/07/php%e4%b8%admemcache%e6%89%a9%e5%b1%95set%e5%a4%b1%e8%b4%a5%e7%9a%84%e8%a7%a3%e5%86%b3/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 09:45:05 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[PHP高级应用]]></category>
		<category><![CDATA[failed]]></category>
		<category><![CDATA[memcache]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[失败]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=78</guid>
		<description><![CDATA[在代码中遇到了memcache set方法失败的问题，无任何错误提示，PHP的memcache扩展本身也没有debug或者error提示。同样的代码，将本地的环境跟服务器的环境对比了一下（在服务器端一直没有遇到这个问题），发现原来是我所使用的php memcache扩展版本较低导致的。PECL有个bug报告http://pecl.php.net/bugs/bug.php?id=9486 ，也是提到这个问题了，在新的版本中已经解决了（2.1.1）。 使用php的memcache扩展时，如果给set/get方法传递一个空值（NULL），则会导致memcached服务端主动关闭连接，见如下的代码示范： &#160; $mem&#160;=&#160;new&#160;Memcache(); $mem-&#62;connect(&#8217;192.168.64.12&#8242;,&#160;&#8217;11211&#8242;); $mem-&#62;set(&#8216;aaa&#8217;,&#160;array(&#8216;aaa&#8217;));&#160;//成功 $mem-&#62;set($aaaa,&#160;&#8216;aaaa&#8217;);&#160;//失败，并导致到memcached服务器的连接丢失，所以之后的方法都失败了（返回false） $mem-&#62;set(&#8216;bbb&#8217;,&#160;array(&#8216;bbb&#8217;));//失败 $mem-&#62;get(&#8216;aaa&#8217;);//失败 没有测试memcached扩展是否有过这样的bug。 顺便提一下在PHP中memcached和memcache是两个不同的扩展，区别是memcached基于libmemcached库封装的API接口。见PHP手册 This extension uses libmemcached library to provide API for communicating with memcached servers. It also provides a session handler (memcached). 而通常所说的memcached就是指memcached服务器端。 另外如果key过长（250以上），value过大（1M以上）或者过期时间过长（大于2592000）都会导致set失败。]]></description>
			<content:encoded><![CDATA[<p>在代码中遇到了memcache set方法失败的问题，无任何错误提示，PHP的memcache扩展本身也没有debug或者error提示。同样的代码，将本地的环境跟服务器的环境对比了一下（在服务器端一直没有遇到这个问题），发现原来是我所使用的php memcache扩展版本较低导致的。PECL有个bug报告http://pecl.php.net/bugs/bug.php?id=9486 ，也是提到这个问题了，在新的版本中已经解决了（2.1.1）。</p>
<p>使用php的memcache扩展时，如果给set/get方法传递一个空值（NULL），则会导致memcached服务端主动关闭连接，见如下的代码示范：<br />
&nbsp;</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$mem&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">=&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">new&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">Memcache();</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$mem</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">-&gt;connect(</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">&#8217;192.168.64.12&#8242;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">,&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">&#8217;11211&#8242;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$mem</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">-&gt;set(</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">&#8216;aaa&#8217;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">,&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">array</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">(</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">&#8216;aaa&#8217;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">));&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(128,128,128); font-size: 10pt; mso-spacerun: 'yes'">//成功</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; text-decoration: underline; mso-spacerun: 'yes'">$mem</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; text-decoration: underline; mso-spacerun: 'yes'">-&gt;set(</span><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; text-decoration: underline; mso-spacerun: 'yes'">$aaaa</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; text-decoration: underline; mso-spacerun: 'yes'">,&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; text-decoration: underline; mso-spacerun: 'yes'">&#8216;aaaa&#8217;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; text-decoration: underline; mso-spacerun: 'yes'">);&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(128,128,128); font-size: 10pt; text-decoration: underline; mso-spacerun: 'yes'">//失败，并导致到memcached服务器的连接丢失，所以之后的方法都失败了（返回false）</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$mem</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">-&gt;set(</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">&#8216;bbb&#8217;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">,&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">array</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">(</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">&#8216;bbb&#8217;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">));</span><span style="font-family: 'Courier New'; color: rgb(128,128,128); font-size: 10pt; mso-spacerun: 'yes'">//失败</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$mem</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">-&gt;get(</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">&#8216;aaa&#8217;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">);</span><span style="font-family: 'Courier New'; color: rgb(128,128,128); font-size: 10pt; mso-spacerun: 'yes'">//失败</span><!--EndFragment--></p>
<p>没有测试memcached扩展是否有过这样的bug。<br />
顺便提一下在PHP中memcached和memcache是两个不同的扩展，区别是memcached基于libmemcached库封装的API接口。见PHP手册<br />
This extension uses libmemcached library to provide API for communicating with memcached servers. It also provides a session handler (memcached).</p>
<p>而通常所说的memcached就是指memcached服务器端。</p>
<p>另外如果key过长（250以上），value过大（1M以上）或者过期时间过长（大于2592000）都会导致set失败。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2009/07/php%e4%b8%admemcache%e6%89%a9%e5%b1%95set%e5%a4%b1%e8%b4%a5%e7%9a%84%e8%a7%a3%e5%86%b3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>第一次工作月总结</title>
		<link>http://www.qingliangcn.com/2009/05/%e7%ac%ac%e4%b8%80%e6%ac%a1%e5%b7%a5%e4%bd%9c%e6%9c%88%e6%80%bb%e7%bb%93/</link>
		<comments>http://www.qingliangcn.com/2009/05/%e7%ac%ac%e4%b8%80%e6%ac%a1%e5%b7%a5%e4%bd%9c%e6%9c%88%e6%80%bb%e7%bb%93/#comments</comments>
		<pubDate>Sat, 23 May 2009 10:03:38 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[暂未分类]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[工作总结]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=84</guid>
		<description><![CDATA[工作已经两个月, 有一些汗水, 有一些收获, 有一些欢乐, 有一些郁闷. 前方的路依然光明, 我要继续走下去. 整理一下两个月的收获和问题，说的不全，完全以这段时间的实践为主线。 一 面向对象 VS 面向过程 1.我们的选择 项目开始时，技术经理那边决定使用面向过程作为我们的主要开发方式，当时主要的考虑点是效率和项目人员对OO和面向过程的熟悉程度。 我们的项目是一个交易平台，预计并发、高负载、快速响应会是项目最重要的问题，再结合PHP本身的特点，我们觉得面向过程应该是我们的更好选择。 另外，项目中，除了我本人接触的OO较多外，其他人对于OO的理解还仅仅位于&#8220;对象&#8221;上， 对OOA/OOD/Design Pattern等基本无概念，而由于我们的时间和现有资源的问题，我们也不可能进行这方面的入职培训。 所以最终我们决定使用面向过程。 2.如何选择 很多人大谈OO或者面向过程的好处，互相攻击对方的方法缺陷。就讨论本身而言，辩论有利于更好的交流以及对知识更深层次的理解。但也容易带来一些偏见，这些往往是由于个人的阅历经验、对新事物的心态以及是否辩证看待事物有关。每个人的工作环境、项目要求等等都不尽相同，而OO和面向过程都不是万能的解决方案，他们有各自的优缺点，有各自的适应环境（所以不能一概而论， 不能断定哪种方式绝对的好），同时也有重叠的部分（既然有重叠，那么在某些情况下使用OO和面向过程皆可，具体使用哪一种，主要取决于个人的偏好）。 因而我们讨论两种方法，重点在于分析他们各自的利弊、适应环境，而不是打败对方。我们的目的在于赢得真理， 而不是赢得讨论。无论枪有多好，刀也不会淘汰；同时枪也的确比刀强大很多&#8212;某些情况下。 以下我的一些粗浅的个人理解，用于快速的判断实际应该如何选择。限于经验和个人水平，如有不妥甚至错误的地方，欢迎指出来。 * 面向对象有利于直接将现实中的&#8220;对象&#8221;移植过来，而面向过程则有利于直接应用我们生活中最常见的&#8220;过程式&#8221;思想。但是希望大家明白，现实世界并非完全&#8220;对象&#8221;，也并非完全的&#8220;过程&#8221;。当你的项目比较简单，业务逻辑也比较简单的情况下，面向过程可能是更加快速的选择，因为在这种情况下，你不必考虑太多的类设计，简单的&#8220;一步步来&#8221;即可。如果你的业务逻辑相当的复杂，在很多地方可能会大量的重用某些逻辑处理，你们的团队相当的庞大，你们需要紧密的合作等等，此时OO的优势将会非常明显。 * 项目要求和项目环境。如果你的PHP版本过低（如PHP4甚至PHP3），由于语言本身对面向对象的支持不够好，某些本来是面向对象的优点也会变成缺点，同时很多面向对象的特性也不能应用，这个时候再坚持OO就不是个好的选择了。 或者更干脆你用的是想C语言这样的完全不支持OO的编程语言，那么什么也别想了 &#8212;&#8211;&#160;&#160;你想煮饭，首先得要有米才行。 * 应用某方式的成本。就像我们的团队一样，并非每个人都能理解OO，即使理解，理解程度也不尽相同，这可能会为大家的合作、项目的维护等带来不便。所以很多公司都有入职培训，不管你水平如何，大家一起培训，争取将大家调整到一个相近的水平线上。这需要时间、资金以及人力的投入，有时候最优的技术选择并不见得是最好的选择。 这里只能简单的列出几点判断要点，详细说的话，几本书也说不完，欢迎大家继续和我交流论坛。 PHP面向过程项目的一些细节 模板 对于一个稍有规模的网站（如何判断是没有标准的），页面显示和业务逻辑分离是一个非常重要的问题，可以说它在一定程度上决定了我们的项目的工作效率。对于很多程序员来说，编写程序的同时还要处理HTML，css，js等是一个嫉妒可怕的噩梦。可悲的是，目前为止并没有一种很好的解决方案能使得PHP程序员完全摆脱这种局面；可喜的是，我们已经有比较折中的方案：模板。 模板可以说是无数PHP程序员甚至是美工的救世主，它很方便的分离了页面显示和业务逻辑 &#8212;- 当然它不可能完全分离的开来，不过总归是比之前好太多了。比较有名如Smarty，PHPLib Template等等，前者属于编译型，后者则属解释型，各有优点，有兴趣可以搜索下。 &#160;&#160;在我们的项目中，网站有公共的头部和尾部，准确的来说，有两个公共的头部和一个尾部，如果头部和尾部都唯一的话相对来说就简单一些了。 还是考虑到我们的网站对性能上的要求，我们决定不采用任何模板技术，或者说我们决定采用内嵌PHP代码方式的模板。大家先来看下面的代码： &#160; Smarty方式： &#60;{foreach&#160;name=results&#160;from=$results&#160;item=result}&#62; &#60;b&#62;&#60;{$result.name}&#62;&#60;/b&#62; &#60;b&#62;&#60;{$result.id}&#62;&#60;/b&#62; &#60;{/foreach}&#62; 使用HereDoc： &#60;!&#8211; EOT; foreach($results&#160;as&#160;$value){print&#60;&#60;&#60;EOT &#8211;&#62; &#60;b&#62;{$value['name']}&#60;/b&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>工作已经两个月, 有一些汗水, 有一些收获, 有一些欢乐, 有一些郁闷. 前方的路依然光明, 我要继续走下去.</p>
<p>整理一下两个月的收获和问题，说的不全，完全以这段时间的实践为主线。</p>
<p><strong>一 面向对象 VS 面向过程</strong><br />
<strong>1.我们的选择</strong><br />
项目开始时，技术经理那边决定使用面向过程作为我们的主要开发方式，当时主要的考虑点是效率和项目人员对OO和面向过程的熟悉程度。<br />
我们的项目是一个交易平台，预计并发、高负载、快速响应会是项目最重要的问题，再结合PHP本身的特点，我们觉得面向过程应该是我们的更好选择。<br />
另外，项目中，除了我本人接触的OO较多外，其他人对于OO的理解还仅仅位于&ldquo;对象&rdquo;上， 对OOA/OOD/Design Pattern等基本无概念，而由于我们的时间和现有资源的问题，我们也不可能进行这方面的入职培训。 所以最终我们决定使用面向过程。</p>
<p><strong>2.如何选择<br />
</strong>很多人大谈OO或者面向过程的好处，互相攻击对方的方法缺陷。就讨论本身而言，辩论有利于更好的交流以及对知识更深层次的理解。但也容易带来一些偏见，这些往往是由于个人的阅历经验、对新事物的心态以及是否辩证看待事物有关。每个人的工作环境、项目要求等等都不尽相同，而OO和面向过程都不是万能的解决方案，他们有各自的优缺点，有各自的适应环境（所以不能一概而论， 不能断定哪种方式绝对的好），同时也有重叠的部分（既然有重叠，那么在某些情况下使用OO和面向过程皆可，具体使用哪一种，主要取决于个人的偏好）。<br />
因而我们讨论两种方法，重点在于分析他们各自的利弊、适应环境，而不是打败对方。我们的目的在于赢得真理， 而不是赢得讨论。无论枪有多好，刀也不会淘汰；同时枪也的确比刀强大很多&#8212;某些情况下。<span id="more-84"></span><br />
以下我的一些粗浅的个人理解，用于快速的判断实际应该如何选择。限于经验和个人水平，如有不妥甚至错误的地方，欢迎指出来。<br />
* 面向对象有利于直接将现实中的&ldquo;对象&rdquo;移植过来，而面向过程则有利于直接应用我们生活中最常见的&ldquo;过程式&rdquo;思想。但是希望大家明白，现实世界并非完全&ldquo;对象&rdquo;，也并非完全的&ldquo;过程&rdquo;。当你的项目比较简单，业务逻辑也比较简单的情况下，面向过程可能是更加快速的选择，因为在这种情况下，你不必考虑太多的类设计，简单的&ldquo;一步步来&rdquo;即可。如果你的业务逻辑相当的复杂，在很多地方可能会大量的重用某些逻辑处理，你们的团队相当的庞大，你们需要紧密的合作等等，此时OO的优势将会非常明显。<br />
* 项目要求和项目环境。如果你的PHP版本过低（如PHP4甚至PHP3），由于语言本身对面向对象的支持不够好，某些本来是面向对象的优点也会变成缺点，同时很多面向对象的特性也不能应用，这个时候再坚持OO就不是个好的选择了。 或者更干脆你用的是想C语言这样的完全不支持OO的编程语言，那么什么也别想了 &#8212;&#8211;&nbsp;&nbsp;你想煮饭，首先得要有米才行。<br />
* 应用某方式的成本。就像我们的团队一样，并非每个人都能理解OO，即使理解，理解程度也不尽相同，这可能会为大家的合作、项目的维护等带来不便。所以很多公司都有入职培训，不管你水平如何，大家一起培训，争取将大家调整到一个相近的水平线上。这需要时间、资金以及人力的投入，有时候最优的技术选择并不见得是最好的选择。<br />
这里只能简单的列出几点判断要点，详细说的话，几本书也说不完，欢迎大家继续和我交流论坛。</p>
<p><strong>PHP面向过程项目的一些细节<br />
</strong>模板<br />
对于一个稍有规模的网站（如何判断是没有标准的），页面显示和业务逻辑分离是一个非常重要的问题，可以说它在一定程度上决定了我们的项目的工作效率。对于很多程序员来说，编写程序的同时还要处理HTML，css，js等是一个嫉妒可怕的噩梦。可悲的是，目前为止并没有一种很好的解决方案能使得PHP程序员完全摆脱这种局面；可喜的是，我们已经有比较折中的方案：模板。<br />
模板可以说是无数PHP程序员甚至是美工的救世主，它很方便的分离了页面显示和业务逻辑 &#8212;- 当然它不可能完全分离的开来，不过总归是比之前好太多了。比较有名如Smarty，PHPLib Template等等，前者属于编译型，后者则属解释型，各有优点，有兴趣可以搜索下。</p>
<p>&nbsp;&nbsp;在我们的项目中，网站有公共的头部和尾部，准确的来说，有两个公共的头部和一个尾部，如果头部和尾部都唯一的话相对来说就简单一些了。<br />
还是考虑到我们的网站对性能上的要求，我们决定不采用任何模板技术，或者说我们决定采用内嵌PHP代码方式的模板。大家先来看下面的代码：<br />
&nbsp;</p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">Smarty<font face="宋体">方式：</font></span><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;{foreach&nbsp;name=results&nbsp;from=$results&nbsp;item=result}&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;</span><span style="font-family: 'Courier New'; color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;{$result.name}&gt;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;/</span><span style="font-family: 'Courier New'; color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;</span><span style="font-family: 'Courier New'; color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;{$result.id}&gt;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;/</span><span style="font-family: 'Courier New'; color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;{/foreach}&gt;</span><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">使用<font face="Times New Roman">HereDoc</font><font face="宋体">：</font></span><span style="font-family: '宋体'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;!&#8211;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">EOT;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">foreach($results&nbsp;as&nbsp;$value){print&lt;&lt;&lt;EOT</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">&#8211;&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">{$value['name']}</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;/</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">{$value['id']}</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&lt;/</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(163,21,21); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;!&#8211;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">EOT;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; background: rgb(255,255,255); color: rgb(0,128,0); font-size: 10pt; mso-spacerun: 'yes'">&#8211;&gt;</span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'">嵌入<font face="Times New Roman">html</font><font face="宋体">代码：</font></span><span style="font-family: '宋体'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;?php</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">foreach</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">(</span><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$results&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">as&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$value</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">){</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">?&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&lt;</span><span style="font-family: 'Courier New'; color: rgb(63,127,127); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;?php</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">echo&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$value</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">[</span><span style="font-family: 'Courier New'; color: rgb(0,130,0); font-size: 10pt; mso-spacerun: 'yes'">'name'</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">];</span><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">?&gt;</span><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&lt;/</span><span style="font-family: 'Courier New'; color: rgb(63,127,127); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&lt;</span><span style="font-family: 'Courier New'; color: rgb(63,127,127); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;?php</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(0,0,255); font-size: 10pt; mso-spacerun: 'yes'">echo&nbsp;</span><span style="font-family: 'Courier New'; color: rgb(102,0,0); font-size: 10pt; mso-spacerun: 'yes'">$value</span><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">[id];</span><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">?&gt;</span><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&lt;/</span><span style="font-family: 'Courier New'; color: rgb(63,127,127); font-size: 10pt; mso-spacerun: 'yes'">b</span><span style="font-family: 'Courier New'; color: rgb(0,128,128); font-size: 10pt; mso-spacerun: 'yes'">&gt;</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">&lt;?php</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(0,0,0); font-size: 10pt; mso-spacerun: 'yes'">}</span><span style="font-family: 'Courier New'; font-size: 10pt; mso-spacerun: 'yes'"><o:p></o:p></span></p>
<p class="p0" style="margin-top: 0pt; margin-bottom: 0pt"><span style="font-family: 'Courier New'; color: rgb(255,0,0); font-size: 10pt; mso-spacerun: 'yes'">?&gt;</span></p>
<p><!--EndFragment--></p>
<p>
上面的代码很简单，从一个表中取出用户列表，然后循环显示。代码一和代码二的功能实际上时一样的，不同的是代码1采用了模板（smarty语法），代码2采用了PHP原生语法（heredoc）。我们可以看到我们用原生的语法完成了模板所对应的功能，并且代码也同样的简单。可能有人说，smarty可以编译，可以缓存，有很多辅助函数，这些你通过简单的代码能够实现吗？ <br />
对于上面的问题，我的看法如下：<br />
* 我认为smarty这种编译型模板提供的诸多额外函数做了过多的事情。在MVC模式下，这些函数所做的事情已经超出了V层的职责，会导致更换V层时，重复的编写一些代码，例如将V层从HTML换成WAP或者XML。当然这一点并不能使得我们做出放弃smarty的决定，因为项目不见得采用MVC模式开发，同时你也可以避免使用Smarty的某些函数。<br />
* 几乎所有模板都使用自己的一套语法，学习代价高。smarty3已经使用PHP的原生语法了。<br />
* 很多项目实时性要求相当高（我们的项目就是如此），采用编译型模板会导致数据不能及时显示，而且因为更新快，它的编译功能将变成鸡肋。而解释型模板由于不缓存结果（如果你给解释型模板提供缓存功能的话，那另当别论），每次请求都重新解释，效率不高、资源消耗相对较多。<br />
*根据前面三点，我们发现PHP本身就能够完成我们要求的功能。</p>
<p>我的看法带有片面性，因为我主要是就着我当前的项目来讨论的。</p>
<p>对于模块下公共文件的重复利用的问题，我们使用ob系列的函数来替换即可，PHP中字符串替换的效率是相当高的（尽量不要用正则）。</p>
<p><strong>纯粹的面向过程吗？<br />
</strong>我们的项目属于大中型的项目，实际编码中发现有大量的重复代码，我们的业务逻辑相当的复杂（特别是在线支付模块），这个时候我们简单了考虑了一下便决定适当的使用一些对象（当然，这还称不上OO）。我们不是纯粹的面向对象狂热者，同样也不是面向过程狂热者，只有最合适的，没有最好的。</p>
<p><strong>项目成功&ne;技术先进</strong><br />
其实这不属于面向过程的专属内容，它应该是超越开发方法的。不管你采用哪种方法开始，项目的完成才是最重要的，技术不能代表和决定一切，现实和理想总是有所相隔。代码可以重构，而项目可能没有机会进行第二次。大家要把握平衡点。<br />
&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2009/05/%e7%ac%ac%e4%b8%80%e6%ac%a1%e5%b7%a5%e4%bd%9c%e6%9c%88%e6%80%bb%e7%bb%93/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP单例模式的必要性</title>
		<link>http://www.qingliangcn.com/2009/03/php%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f%e7%9a%84%e5%bf%85%e8%a6%81%e6%80%a7/</link>
		<comments>http://www.qingliangcn.com/2009/03/php%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f%e7%9a%84%e5%bf%85%e8%a6%81%e6%80%a7/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 12:10:46 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[暂未分类]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[单用例]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=99</guid>
		<description><![CDATA[&#160; 多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种&#34;计划生育&#34;.&#160;&#160;而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看. 1. php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源. 2. 如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分. 3. 在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志.避免到处var_dump, echo.]]></description>
			<content:encoded><![CDATA[<p>&nbsp; 多数人都是从单例模式的字面上的意思来理解它的用途, 认为这是对系统资源的节省, 可以避免重复实例化, 是一种&quot;计划生育&quot;.&nbsp;&nbsp;而PHP每次执行完页面都是会从内存中清理掉所有的资源. 因而PHP中的单例实际每次运行都是需要重新实例化的, 这样就失去了单例重复实例化的意义了. 单单从这个方面来说, PHP的单例的确有点让各位失望. 但是单例仅仅只有这个功能和应用吗? 答案是否定的,我们一起来看看.</p>
<p>1.<br />
php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 在使用面向对象的方式开发时(废话), 如果使用单例模式, 则可以避免大量的new 操作消耗的资源.</p>
<p>2.<br />
如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看zend Framework的FrontController部分.</p>
<p>3.<br />
在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志.避免到处var_dump, echo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2009/03/php%e5%8d%95%e4%be%8b%e6%a8%a1%e5%bc%8f%e7%9a%84%e5%bf%85%e8%a6%81%e6%80%a7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>upload.class.php的一点改进</title>
		<link>http://www.qingliangcn.com/2007/04/upload-class-php%e7%9a%84%e4%b8%80%e7%82%b9%e6%94%b9%e8%bf%9b/</link>
		<comments>http://www.qingliangcn.com/2007/04/upload-class-php%e7%9a%84%e4%b8%80%e7%82%b9%e6%94%b9%e8%bf%9b/#comments</comments>
		<pubDate>Fri, 27 Apr 2007 13:32:59 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[暂未分类]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[upload]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=48</guid>
		<description><![CDATA[/** * * @version $Id: upload.class.php,v 1.4 2007/04/27 00:52 xm.zhuge Exp $ * @copyright (c) 2007 Nandou Group * @license http://opensource.org/licenses/gpl-license.php GNU Public License */ *优化了结果信息提示 *更改了默认构造函数的实现，方便参数传递 +增加文件保存路径统计，文件上传数目统计 代码下载]]></description>
			<content:encoded><![CDATA[<p>/**<br />
*<br />
* @version $Id: upload.class.php,v 1.4 2007/04/27 00:52  xm.zhuge Exp $<br />
* @copyright (c) 2007 Nandou Group<br />
* @license http://opensource.org/licenses/gpl-license.php GNU Public License<br />
*/</p>
<p>*优化了结果信息提示<br />
*更改了默认构造函数的实现，方便参数传递<br />
+增加文件保存路径统计，文件上传数目统计</p>
<p><a href='http://www.nd21.com/blog/wp-content/uploads/2009/07/1177606902_0.rar'>代码下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2007/04/upload-class-php%e7%9a%84%e4%b8%80%e7%82%b9%e6%94%b9%e8%bf%9b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>NdUpload套件1.0.1</title>
		<link>http://www.qingliangcn.com/2007/04/ndupload%e5%a5%97%e4%bb%b61-0-1/</link>
		<comments>http://www.qingliangcn.com/2007/04/ndupload%e5%a5%97%e4%bb%b61-0-1/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 13:24:59 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[暂未分类]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[upload]]></category>
		<category><![CDATA[文件上传]]></category>

		<guid isPermaLink="false">http://www.nd21.com/?p=40</guid>
		<description><![CDATA[NdUpload套件包含两个文件：NdUpload.php和NdUploadForm.php，分别是文件上传类和表单生成类。 更新日志： 2007-04-11 20:40 , v 1.0.1 *改进了文件类型识别方式 代码下载]]></description>
			<content:encoded><![CDATA[<p>NdUpload套件包含两个文件：NdUpload.php和NdUploadForm.php，分别是文件上传类和表单生成类。</p>
<p>更新日志：<br />
2007-04-11 20:40 , v 1.0.1<br />
*改进了文件类型识别方式</p>
<p><a href='http://www.nd21.com/blog/wp-content/uploads/2007/04/1176309551_0.rar'>代码下载</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2007/04/ndupload%e5%a5%97%e4%bb%b61-0-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>表单生成类NdUploadForm</title>
		<link>http://www.qingliangcn.com/2007/04/%e8%a1%a8%e5%8d%95%e7%94%9f%e6%88%90%e7%b1%bbnduploadform/</link>
		<comments>http://www.qingliangcn.com/2007/04/%e8%a1%a8%e5%8d%95%e7%94%9f%e6%88%90%e7%b1%bbnduploadform/#comments</comments>
		<pubDate>Tue, 10 Apr 2007 05:57:48 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[暂未分类]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[表单]]></category>
		<category><![CDATA[表单生成]]></category>

		<guid isPermaLink="false">http://www.nd21.com/wordpress/?p=35</guid>
		<description><![CDATA[&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 系统环境：Windows XP SP2 + php 5.2.1 + mysql 5.0 + Apache 2.2.24 开发环境：Zend Studio 5.5 参数： safe_mode = Off error_reporting = E_ALL &#038; ~E_NOTICE register_globals =Off magic_quotes_runtime = Off &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; 可以和之前发的php上传类配合使用，我一起发上来。 Demo代码： NdForm]]></description>
			<content:encoded><![CDATA[<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>系统环境：Windows XP SP2 + php 5.2.1 + mysql 5.0 + Apache 2.2.24<br />
开发环境：Zend Studio 5.5<br />
参数： safe_mode = Off<br />
         error_reporting  =  E_ALL &#038; ~E_NOTICE<br />
         register_globals =Off<br />
         magic_quotes_runtime = Off</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
<span id="more-35"></span></p>
<pre lang="php">

<?php
/**
*
* @package NDNotebook
* @version $Id: NdUploadForm.php,v 1.0.0 2007/04/02 00:04:24 xm.zhuge Exp $
* @copyright (c) 2007 Nandou Studio
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
* @thanks : XUpload
*/

class NdUploadForm
{
 var $nd_formheader;
 var $nd_formend;
 var $nd_formmaxFileSize;

 function NdUploadForm($uptofile="upload.php", $method = "post", $maxfilesize = "1024 * 1024")
 {
   $this->nd_formheader = '
<form method="'.$method.'" enctype="multipart/form-data" action="'.$uptofile.'">';
   $this->nd_formmaxFileSize = $maxfilesize;
   $this->nd_formend = '</form>

';
 }

 function appendInput($type, $name, $value)
 {
   $tmp = '
<input type="'.$type.'" '.'name="'.$name.'" value="'.$value.'">';
   echo $tmp."\n";
 }

 function formHeader()
 {
   echo $this->nd_formheader."\n";
 }

 function formMaxSize()
 {
   $size = '
<input type="hidden" name="MAX_FILE_SIZE" value="'.$this->nd_formmaxFileSize.'">';
   echo $size."\n";
 }

 function formEnd()
 {
   echo $this->nd_formend."\n";
 }
}
?>
</pre>
<p>    可以和之前发的php上传类配合使用，我一起发上来。</p>
<pre lang="php">
 Demo代码：

<?php
error_reporting(E_ALL &#038; ~E_NOTICE);
require_once('class/NdUpload.php');
require_once('class/NdUploadForm.php');
$max_filesize = 1024 * 1024;
$arr_filetype = array('.zip','.rar','.jpg','.gif','.bmp','.doc');

extract($_POST);
if (isset($upfile) &#038;&#038; $upfile == 'upfile')
{
 $file = $_FILES['file']['tmp_name'];
 $file_name = $_FILES['file']['name'];
 $file_size = $_FILES['file']['size'];

 $upfile = new NdUpload();
 $upfile->setDir('./upload/');
 $upfile->copyFile();
 $upfile->showError();
}

?>
<html>
<head>
<META http-equiv=Content-Type content="text/html; charset=utf-8">

</head>

<body>
<?php
$form = new NdUploadForm('test.php', "post", $max_filesize);
$form->formHeader();
$form->appendInput("file", "file", "浏览");
$form->appendInput("hidden", "upfile", "upfile");
$form->formMaxSize();
$form->appendInput("submit", "submit", "上传");
$form->formEnd();
?>

</body>
</html>
</pre>
<p><a href='http://www.nd21.com/wordpress/wp-content/uploads/2009/07/1176213157_0.rar'>NdForm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2007/04/%e8%a1%a8%e5%8d%95%e7%94%9f%e6%88%90%e7%b1%bbnduploadform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP之HereDOC</title>
		<link>http://www.qingliangcn.com/2007/01/21/</link>
		<comments>http://www.qingliangcn.com/2007/01/21/#comments</comments>
		<pubDate>Sat, 13 Jan 2007 16:46:06 +0000</pubDate>
		<dc:creator>庆亮</dc:creator>
				<category><![CDATA[PHP基础应用]]></category>
		<category><![CDATA[heredoc]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.nd21.com/wordpress/?p=21</guid>
		<description><![CDATA[这段代码相信熟悉php的朋友大概都比较熟悉，但是我使用的时候却发现这段代码并没有被执行而是直接打印出来了，检查了一下其他地方没有错误。实在郁闷。去网上找资料，呵呵，看到一句话：EOT 自定义分界符，结束时必须位于行首 。呵呵，原来要求一定要在一行的开始，没想到保持代码风格反而引出了一个小问题。 最后更新: 2009-05-07]]></description>
			<content:encoded><![CDATA[<pre lang="php"><!--<?php
print <<<EOT //这里后不能有任何字符, 注释除外, 即使是空白字符也会导致出错.
-->
<!--
EOT; //这里必须放置在行首，前面不能有空格之内的任何字符
?>-->
</pre>
<p>这段代码相信熟悉php的朋友大概都比较熟悉，但是我使用的时候却发现这段代码并没有被执行而是直接打印出来了，检查了一下其他地方没有错误。实在郁闷。去网上找资料，呵呵，看到一句话：EOT 自定义分界符，结束时必须位于行首 。呵呵，原来要求一定要在一行的开始，没想到保持代码风格反而引出了一个小问题。 最后更新: 2009-05-07</p>
]]></content:encoded>
			<wfw:commentRss>http://www.qingliangcn.com/2007/01/21/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>


