<?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; 变量</title>
	<atom:link href="http://www.qingliangcn.com/tag/%e5%8f%98%e9%87%8f/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源代码分析之变量</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>
	</channel>
</rss>


