<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[容易混淆]PHP static静态变量,PHP static局部静态变量和全局静态变量总结。附上类里的static及用self读取的一个结论。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Php/Js/Shell/Go]]></category>
<pubDate>Sun, 06 Jan 2013 13:31:15 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：看到一个redis的代码用php写的，用到master和slave结构，用到类的函数里的静态变量，一个master里和slave里都用同一个static $_cache;觉得奇怪了，于是查一下这样用它们之间有关联么？一查没有关联（两个变量一样感觉有关联），这就是静态变量的用法，有点意思。<br/>静态变量只存在于函数作用域内，也就是说，静态变量只存活在栈中。一般的函数内变量在函数结束后会释放，比如局部变量，但是静态变量却不会。就是说，下次再调用这个函数的时候，该变量的值会保留下来。<br/>参考：http://www.nowamagic.net/php/php_StaticVariable.php<br/>一）PHP static静态变量只存在函数里的一个实践情况及应用、实践、总结：<br/><textarea name="code" class="php" rows="15" cols="100">
&nbsp;&nbsp;&nbsp;&nbsp;private function init_master()
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static $_cache;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isset($_cache)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;handler = $_cache;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$func = $this-&gt;config[&#039;pconnect&#039;] ? &#039;pconnect&#039; : &#039;connect&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;handler = new Redis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;enable = $this-&gt;handler-&gt;$func($this-&gt;config[&#039;master&#039;][&#039;host&#039;], $this-&gt;config[&#039;master&#039;][&#039;port&#039;]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$_cache = $this-&gt;handler;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// $_cache-&gt;setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;

&nbsp;&nbsp;&nbsp;&nbsp;private function init_slave()
&nbsp;&nbsp;&nbsp;&nbsp;&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static $_cache;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (isset($_cache)) &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;handler = $_cache;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$func = $this-&gt;config[&#039;pconnect&#039;] ? &#039;pconnect&#039; : &#039;connect&#039;;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;handler = new Redis();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&gt;enable = $this-&gt;handler-&gt;$func($this-&gt;config[&#039;slave&#039;][&#039;host&#039;], $this-&gt;config[&#039;slave&#039;][&#039;port&#039;]);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$_cache = $this-&gt;handler;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// $_cache-&gt;setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
</textarea><br/><br/><br/>学习PHP静态变量的基础：<br/><br/><br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?PHP
function Test()&#123;
&nbsp;&nbsp;&nbsp;&nbsp; static $a = 0;
&nbsp;&nbsp;&nbsp;&nbsp; echo $a;
&nbsp;&nbsp;&nbsp;&nbsp; $a++;
&#125;&nbsp;&nbsp;
Test();
Test();
Test();
Test();
Test();
?&gt; 
</textarea><br/><br/>输出：01234<br/>也就是每次用：static $a = 0;时，在第二次无效了。<br/>调用的时候 static $count = 0; 语句会重复执行，这为什么不会导致count变量被重复赋值呢？做如下测试：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
&nbsp;&nbsp;echo &quot;start &#92;n&quot;;

&nbsp;&nbsp; static $a = 10;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;
&nbsp;&nbsp; unset($GLOBALS[&#039;a&#039;]);
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;

&nbsp;&nbsp; static $a = 20;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;
&nbsp;&nbsp; $GLOBALS[&#039;a&#039;] = 10;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;

&nbsp;&nbsp; static $a = 30;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;
&nbsp;&nbsp; unset($GLOBALS[&#039;a&#039;]);
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;

&nbsp;&nbsp; static $a;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;

&nbsp;&nbsp; static $a = 40;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;
&nbsp;&nbsp; $a = 100;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;

&nbsp;&nbsp; static $a = 50;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;

&nbsp;&nbsp; static $a = 4;
&nbsp;&nbsp; echo &quot;$a &#92;n&quot;;

&nbsp;&nbsp; echo &quot;end &#92;n&quot;;

&nbsp;&nbsp; exit;
 ?&gt;
</textarea><br/><br/>结果：<br/><textarea name="code" class="php" rows="15" cols="100">
start 
4 
PHP Notice:&nbsp;&nbsp;Undefined variable: a in /mnt/hgfs/VmwareShareFolder4Linux/a.php on line 7
PHP Stack trace:
PHP&nbsp;&nbsp; 1. &#123;main&#125;() /mnt/hgfs/VmwareShareFolder4Linux/a.php:0
 
4 
10 
10 
PHP Notice:&nbsp;&nbsp;Undefined variable: a in /mnt/hgfs/VmwareShareFolder4Linux/a.php on line 17
PHP Stack trace:
PHP&nbsp;&nbsp; 1. &#123;main&#125;() /mnt/hgfs/VmwareShareFolder4Linux/a.php:0
 
10 
10 
100 
100 
100 
end 
</textarea><br/><br/>代码第5行第一次输出$a的值为4，由此推测PHP在页面初始化的时候分配静态变量的内存，此时使用了同一个变量的最后一次声明的值（这个可以把4改为其他数测试）。代码第7行调用unset函数销毁变量$a，再次输出$a的值时看到未定义变量的提示，说明变量已经被销毁。<br/><br/>第10行再次输出时，输出结果仍是4而不是20，有两种可能，一个是php再次初始化了$a的值，另一种是php使用了$a被销毁前的值，这个问题在第20行输出的时候解决。第16行$a销毁的时候值为10，第19行声明后输出仍为10。<br/><br/>第11行将$a的值修改为10，在14行再次声明$a，17行输出认为10。推测为重复声明时php还是使用静态变量内存中的值，而不再次赋值。<br/><br/>至此，手册中发现的问题，大致上已经解决了，即递归调用中的声明没有改变$count的值，所以递归在$count=10时成功停止。<br/><br/>原文来源：<br/>http://www.cnblogs.com/darkbluever/archive/2011/07/18/2109533.html<br/><br/><br/><br/>PHP static局部静态变量和全局静态变量总结：<br/>静态局部变量的特点：<br/>1.不会随着函数的调用和退出而发生变化，不过，尽管该变量还继续存在，但不能使用它。倘若再次调用定义它的函数时，它又可继续使用，而且保存了前次被调用后留下的值<br/>2.静态局部变量只会初始化一次<br/>3.静态属性只能被初始化为一个字符值或一个常量，不能使用表达式。即使局部静态变量定义时没有赋初值，系统会自动赋初值0（对数值型变量）或空字符（对字符变量）；静态变量的初始值为0。<br/>4.当多次调用一个函数且要求在调用之间保留某些变量的值时，可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的，但全局变量有时会造成意外的副作用，因此仍以采用局部静态变量为宜。<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
function test()
&#123;
&nbsp;&nbsp;&nbsp;&nbsp;static $var = 5;&nbsp;&nbsp;//static $var = 1+1;就会报错
&nbsp;&nbsp;&nbsp;&nbsp;$var++;
&nbsp;&nbsp;&nbsp;&nbsp;echo $var . &quot;&#92;n&quot;;
&#125;

 
test(); //2
test(); //3
test(); //4
//echo $var; 
</textarea><br/>---------- 调试PHP ----------<br/>6<br/>7<br/>8<br/><br/>Output completed (0 sec consumed) - Normal Termination<br/><br/>关于静态全局变量：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
//全局变量本身就是静态存储方式,所有的全局变量都是静态变量
function static_global()&#123;
&nbsp;&nbsp;&nbsp;&nbsp;global $glo;
&nbsp;&nbsp;&nbsp;&nbsp;$glo++;
&nbsp;&nbsp;&nbsp;&nbsp;echo $glo.&quot;&#92;r&#92;n&quot;;
&#125;

static_global(); //1
static_global(); //2
static_global(); //3
echo $glo . &quot;&#92;r&#92;n&quot;; //3
</textarea><br/><br/>所以静态全局变量使用并不多。<br/><br/>AddTime:2017/12/11，标题：【php】php函数中static静态变量的使用<br/>用法:<br/>其实函数中的静态变量和类中的静态变量的用法大同小异<br/><br/>function myFunc()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//函数内的静态变量只作用于此函数<br/>&nbsp;&nbsp;&nbsp;&nbsp;static $myVariable=&#039;jianzhong5137&#039;;<br/>&#125;<br/><br/>实例测试:funstatic.php <br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
function func1() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;static $count = 0; // 初始化静态变量,所有函数共享一个静态变量$count
&nbsp;&nbsp;&nbsp;&nbsp;$count ++;&nbsp;&nbsp;&nbsp;&nbsp;//注意这个累加的过程,每调用一次本函数,$count累加1
&nbsp;&nbsp;&nbsp;&nbsp;echo $count . &quot;&#92;n&quot;;
&#125;
function func2() &#123;
&nbsp;&nbsp;&nbsp;&nbsp;$count = 0;
&nbsp;&nbsp;&nbsp;&nbsp;$count ++;
&nbsp;&nbsp;&nbsp;&nbsp;echo $count . &quot;&#92;n&quot;;
&#125;
/**
 * 输出1--&gt;10
 */
for($i = 0; $i &lt; 10; $i ++)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;func1 ();
&#125;

echo &quot;&#92;n&quot;;

/**
 * 输出10个1
 */
for($i = 0; $i &lt; 10; $i ++)&#123;
&nbsp;&nbsp;&nbsp;&nbsp;func2 ();
&#125;
</textarea><br/><br/>php&nbsp;&nbsp;funstatic.php <br/>1<br/>2<br/>3<br/>4<br/>5<br/>6<br/>7<br/>8<br/>9<br/>10<br/><br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/>1<br/><br/>代码来自：http://blog.csdn.net/yanhui_wei/article/details/8246096<br/><br/><br/><br/>二）附上类里的static及用self读取的一个结论：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
header(&quot;content-type:text/html;charset=utf-8&quot;);
class Human&#123;
 private $private=&quot;我有2块钱&quot;; // 私有变量
 static public $name = &quot;小妹&quot;;
 public $height = 180;
 static public function tell()&#123;
&nbsp;&nbsp;&nbsp;&nbsp; echo self::$name;//静态方法调用静态属性，使用self关键词
&nbsp;&nbsp;&nbsp;&nbsp; echo self::$private; //这儿self是没法访问private变量内容的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp; //echo $this-&gt;height;//错。静态方法不能调用非静态属性
&nbsp;&nbsp;&nbsp;&nbsp; //因为 $this代表实例化对象，而这里是类，不知道 $this 代表哪个对象
 &#125;
 public function say()&#123;
&nbsp;&nbsp;&nbsp;&nbsp; echo self::$name . &quot;我说话了&quot;;
&nbsp;&nbsp;&nbsp;&nbsp; //普通方法调用静态属性，同样使用self关键词
&nbsp;&nbsp;&nbsp;&nbsp; echo $this-&gt;height;
 &#125;
&#125;

$p1 = new Human();
$p1-&gt;say();
//$p1-&gt;tell();//对象可以访问静态方法
echo $p1::$name;//对象访问静态属性。不能这么访问$p1-&gt;name
//因为静态属性的内存位置不在对象里
Human::say();//错。say()方法有$this时出错；没有$this时能出结果,Uncaught Error: Using $this when not in object context。
//但php5.4以上会提示
?&gt;
</textarea><br/>结论：<br/>（1）、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里，调用方法为&quot;类名::属性名&quot;；<br/>（2）、静态方法不需要实例化即可调用。同上<br/>（3）、静态方法不能调用非静态属性。因为非静态属性需要实例化后，存放在对象里；<br/>（4）、静态方法可以调用非静态方法，使用 self 关键词。php里，一个方法被self:: 后，它就自动转变为静态方法；
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [容易混淆]PHP static静态变量,PHP static局部静态变量和全局静态变量总结。附上类里的static及用self读取的一个结论。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>