[容易混淆]PHP static静态变量,PHP static局部静态变量和全局静态变量总结。附上类里的static及用self读取的一个结论。

jackxiang 2013-1-6 21:31 | |
背景:看到一个redis的代码用php写的,用到master和slave结构,用到类的函数里的静态变量,一个master里和slave里都用同一个static $_cache;觉得奇怪了,于是查一下这样用它们之间有关联么?一查没有关联(两个变量一样感觉有关联),这就是静态变量的用法,有点意思。
静态变量只存在于函数作用域内,也就是说,静态变量只存活在栈中。一般的函数内变量在函数结束后会释放,比如局部变量,但是静态变量却不会。就是说,下次再调用这个函数的时候,该变量的值会保留下来。
参考:http://www.nowamagic.net/php/php_StaticVariable.php
一)PHP static静态变量只存在函数里的一个实践情况及应用、实践、总结:



学习PHP静态变量的基础:




输出:01234
也就是每次用:static $a = 0;时,在第二次无效了。
调用的时候 static $count = 0; 语句会重复执行,这为什么不会导致count变量被重复赋值呢?做如下测试:


结果:


代码第5行第一次输出$a的值为4,由此推测PHP在页面初始化的时候分配静态变量的内存,此时使用了同一个变量的最后一次声明的值(这个可以把4改为其他数测试)。代码第7行调用unset函数销毁变量$a,再次输出$a的值时看到未定义变量的提示,说明变量已经被销毁。

第10行再次输出时,输出结果仍是4而不是20,有两种可能,一个是php再次初始化了$a的值,另一种是php使用了$a被销毁前的值,这个问题在第20行输出的时候解决。第16行$a销毁的时候值为10,第19行声明后输出仍为10。

第11行将$a的值修改为10,在14行再次声明$a,17行输出认为10。推测为重复声明时php还是使用静态变量内存中的值,而不再次赋值。

至此,手册中发现的问题,大致上已经解决了,即递归调用中的声明没有改变$count的值,所以递归在$count=10时成功停止。

原文来源:
http://www.cnblogs.com/darkbluever/archive/2011/07/18/2109533.html



PHP static局部静态变量和全局静态变量总结:
静态局部变量的特点:
1.不会随着函数的调用和退出而发生变化,不过,尽管该变量还继续存在,但不能使用它。倘若再次调用定义它的函数时,它又可继续使用,而且保存了前次被调用后留下的值
2.静态局部变量只会初始化一次
3.静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。即使局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量);静态变量的初始值为0。
4.当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成意外的副作用,因此仍以采用局部静态变量为宜。

---------- 调试PHP ----------
6
7
8

Output completed (0 sec consumed) - Normal Termination

关于静态全局变量:


所以静态全局变量使用并不多。

AddTime:2017/12/11,标题:【php】php函数中static静态变量的使用
用法:
其实函数中的静态变量和类中的静态变量的用法大同小异

function myFunc(){
    //函数内的静态变量只作用于此函数
    static $myVariable='jianzhong5137';
}

实例测试:funstatic.php


php  funstatic.php
1
2
3
4
5
6
7
8
9
10

1
1
1
1
1
1
1
1
1
1

代码来自:http://blog.csdn.net/yanhui_wei/article/details/8246096



二)附上类里的static及用self读取的一个结论:

结论:
(1)、静态属性不需要实例化即可调用。因为静态属性存放的位置是在类里,调用方法为"类名::属性名";
(2)、静态方法不需要实例化即可调用。同上
(3)、静态方法不能调用非静态属性。因为非静态属性需要实例化后,存放在对象里;
(4)、静态方法可以调用非静态方法,使用 self 关键词。php里,一个方法被self:: 后,它就自动转变为静态方法;

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/5913/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2017-12-12 10:08
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]