php中static 静态变量和普通变量的区别


Posted in PHP onDecember 01, 2016

php中static 静态变量和普通变量的区别

在变量的前面加上static 就构成了静态变量(static 变量)。

static变量和普通变量的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。

static变量和普通变量的区别:

static全局变量与普通全局变量区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
static局部变量和普通局部变量区别:static局部变量只被初始化一次,下一次依据上一次结果值;
static函数与普通函数区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)

3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

static 变量的好处:

不会被其他文件所访问,修改其他文件中可以使用相同名字的变量,不会发生冲突。

内存中的位置:静态存储区

初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

普通函数实例:

<?php
function Test() {
  $w3sky = 0;
  echo $w3sky;
  $w3sky++;
  /*函数每次调用时都会将 $w3sky 的值设为 0 并输出 "0"。将变量加一的 $w3sky++ 没有其到效果,因为一旦退出本函数则变量 $w3sky 就不存在了。*/
}
?>

 要将变量 $w3sky 定义为静态(static)的,代码如下:

<?php
function Test() {
  static $w3sky = 0;
  echo $w3sky;
  $w3sky++;
} //本函数每调用Test()都会输出 $w3sky 的值并加一。

?>

 静态变量也提供了一种处理递归函数的方法。递归函数是一种自己调用自己的方法。写递归函数时要小心,因为可能会无穷递归下去,没有出口.务必确保 有方法来中止递归。以下这个简单的函数递归计数到 10,使用静态变量 $count 来判断何时停止, 静态变量与递归函数的例子:

<?php
function Test() {
  static $count = 0;
  $count++;
  echo $count;
  if ($count < 10) {
    Test();
  }
  $count--;
}
?>

注: 静态变量不能用表达式的方式声明例如:static $int = 1+2; 这种方式就是错的  而static $int = 1; 这种声明方式则是对的。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
PHP.MVC的模板标签系统(二)
Sep 05 PHP
php中使用Imagick实现图像直方图的实现代码
Aug 30 PHP
php curl post 时出现的问题解决
Jan 30 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 PHP
PHP使用GETDATE获取当前日期时间作为一个关联数组的方法
Mar 19 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
Apr 11 PHP
Zend Framework过滤器Zend_Filter用法详解
Dec 09 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
实例介绍PHP删除数组中的重复元素
Mar 03 PHP
php判断/计算闰年的方法小结【三种方法】
Jul 06 PHP
Laravel 修改默认日志文件名称和位置的例子
Oct 17 PHP
php 如何禁用eval() 函数实例详解
Dec 01 #PHP
php+mysql实现简单登录注册修改密码网页
Nov 30 #PHP
thinkPHP模板中函数的使用方法示例
Nov 30 #PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 #PHP
thinkPHP自定义类实现方法详解
Nov 30 #PHP
php版阿里大于(阿里大鱼)短信发送实例详解
Nov 30 #PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
Nov 30 #PHP
You might like
php方法调用模式与函数调用模式简例
2011/09/20 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
IE与FireFox的兼容性问题分析
2007/04/22 Javascript
3款实用的在线JS代码工具(国外)
2012/03/15 Javascript
js生成动态表格并为每个单元格添加单击事件的方法
2014/04/14 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
javascript控制图片播放的实现代码
2020/07/29 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
JQuery异步加载PartialView的方法
2016/06/07 Javascript
关于bootstrap日期转化,bootstrap-editable的简单使用,bootstrap-fileinput的使用详解
2017/05/12 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
JavaScript实现三级联动菜单实例代码
2017/06/26 Javascript
利用JS做网页特效_大图轮播(实例讲解)
2017/08/09 Javascript
浅谈Express.js解析Post数据类型的正确姿势
2019/05/30 Javascript
Vue 实现html中根据类型显示内容
2019/10/28 Javascript
解决父组件将子组件作为弹窗调用只执行一次created的问题
2020/07/24 Javascript
[01:34]2014DOTA2 TI预选赛预选赛 选手比赛房大揭秘!
2014/05/20 DOTA
PyCharm使用教程之搭建Python开发环境
2016/06/07 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
Python 专题一 函数的基础知识
2017/03/16 Python
Python实现正则表达式匹配任意的邮箱方法
2018/12/20 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
python实现车牌识别的示例代码
2019/08/05 Python
python系统指定文件的查找只输出目录下所有文件及文件夹
2020/01/19 Python
python实现飞船大战
2020/04/24 Python
html5播放视频且动态截图实现步骤与代码(支持safari其他未测试)
2013/01/06 HTML / CSS
网络工程专业毕业生推荐信
2013/10/28 职场文书
毕业生自荐书
2013/12/18 职场文书
服装机修工岗位职责
2013/12/26 职场文书
黄河的主人教学反思
2014/02/07 职场文书
广告设计应届生求职信
2014/03/01 职场文书
联欢晚会主持词
2014/03/25 职场文书
步步惊心观后感
2015/06/12 职场文书
工作表现证明
2015/06/15 职场文书