php中在变量和函数前加static关键字之后的区别
2017-05-06 18:29
399 查看
php中在变量和函数前加static关键字之后的区别
上课时老师提到在变量和函数前加上static的作用,今天来总结一下:
一、函数内的static变量
static静态变量的理解 静态变量 类型说明符是static。 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用。 另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。 所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。 静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。 静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
<?php function fun1(){ $count = 0; $count ++; echo $count; } for($i=0; $i<10; $i++){ fun1(); } ?>
输出:1111111111
<?php function fun1(){ static $count = 0; $count ++; echo $count; } for($i=0; $i<10; $i++){ fun1(); } ?>
输出:12345678910
<?php function fun1(){ $count = 0; $count ++; echo $count; } $count = 2; echo $count; echo "\n"; for($i=0; $i<10; $i++){ fun1(); } ?>
输出:2 1111111111 分析:函数内的$count是一个局部变量
二.静态方法
static全局变量和普通全局变量,static局部变量和普通局部变量,static函数与普通函数的区别?下面本文将一一为你解答。 (1)全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 (2)从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。 (3)static函数与普通函数作用域不同,仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件。
看下面代码
test.php
<?php require "test1.php"; function funa(){ echo "Hello World!!!"; } ?> ?>
test1.php
<?php function funb(){ funa(); } funb(); ?>
执行test.php得到结果
Hello World!!!
php默认函数是public,故其作用域是整个源程序,导致test1.php也能执行funa()
最后:
引用了http://www.phpernote.com/php-template-framework/625.html
http://blog.csdn.net/u014033518/article/details/46931781
相关文章推荐
- static全局变量与普通全局变量/static局部变量与普通局部变量/static函数与普通函数的区别
- static修饰全局变量 局部变量和函数时候的区别
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- php的static关键字和全局变量
- java——构造函数、构造代码块、Static关键字、main函数 & 继承:子父类中的变量、函数的特点、抽象类、接口等
- static全局变量,局部变量,函数与普通全局变量,局部变量和函数的区别
- static全局变量与普通的全局变量?static局部变量和普通局部变量?static函数与普通函数有什么区别?
- (转载)static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static全局变量与普通的全局变量、static局部变量和普通局部变量、static函数与普通函数的区别
- PHP判断变量是否存在及函数isset() 、empty()与is_null的区别
- C和C++编程中static关键字的含义-修饰函数和变量
- php 函数引用、变量引用、对象引用的区别
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static 全局变量与普通的全局变量的区别/static局部变量和普通局部变量的区别/static函数与普通函数的区别[转]
- php各种判断变量为空的函数的区别
- 曾经遇到的面试题:C语言中对于全局变量来说加不加static关键字有什么区别
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?
- static全局变量与普通的全局变量的区别/static局部变量和普通局部变量的区别/static函数与普通函数的区别
- static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?(转)