【web 开发基础】PHP 变量的作用范围 (29)
前言
变量的作用范围也就是他的生效范围。大部分的 PHP 变量只有一个单独的使用范围,也包含了 include 和 require 引入的文件。当一个变量执行赋值的动作后,会随着声明区域的位置差异而有不同的使用范围。大致上说,变量会依据声明的位置分为局部变量和全局变量两种。
局部变量
局部变量也称为内部变量,是在函数内部声明的变量,其作用域仅限于函数内部,离开这个函数后再使用这种变量是非法的。不仅在函数中声明的变量是局部变量,为声明函数设置的参数因为只能在本函数内部使用,所以也是局部变量。区别在于函数的参数具体数值从函数外部获得(函数被调用时传入的值),而直接在函数中声明的变量只能在函数内部被赋值。但他们的作用域都仅限于函数内部,因为当每次函数被调用时,函数内部的变量被声明,执行完毕后函数内部的变量都被释放。如下代码所示:
执行结果如下:
![](https://static001.geekbang.org/infoq/f3/f3f1001551e1a1f9cf40194971bc7002.png)
在上面的例子中,声明了一个 test()函数,当调用 test()时才会声明两个变量 $one 和 $two,这两个变量都是局部变量。变量 $one 是在参数中声明的并在调用时被赋值 300,另一个变量 $two 是在函数中声明的并直接赋值 100,这两个局部变量只能在函数的内部使用,输出计算结果。当 test()函数执行结束时,这两个变量就会被释放。因此在函数外部访问这两个变量时时不存在的,所以没有输出结果。如果在函数外部需要调用该变量值,必须通过 return 指令将其值传回至主程序区块以做后续处理。如下所示:
执行结果如下:
![](https://static001.geekbang.org/infoq/96/96a911acde747010f5a47366b8c01054.png)
全局变量
全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。和其他编程语言不同,全局变量不是自动设置为可用的。在 PHP 中,由于函数可以视为单独的程序片段,所以局部变量会覆盖全局变量的能见度,我平时会把它称为就近原则。因此在函数中无法直接调用全局变量。
执行结果:
![](https://static001.geekbang.org/infoq/d8/d82654d7acde2cae1a6e2e0883e390d6.png)
在上面的例子中,函数 test()外面声明了两个全局变量 $one 和 $two,但在 PHP 中,不能直接在函数中使用全局变量。所以在 test()函数中使用的变量 $one 和 $two,相当于新声明的两个变量,并没有被赋初值,是两个空值运算,所以得到的结果为 0.在函数中若使用其全局变量,必须要利用 global 关键字定义目标变量,以告诉函数主体此变量为全局变量。如下面代码所示:
执行结果如下:
![](https://static001.geekbang.org/infoq/fa/fa2d5e6cccb66df0422ef9a88b39847b.png)
在函数中使用全局变量,除了使用关键字 global,还可以使用特殊的 PHP 自定义 GLOBALS 数组。前面的例子的写成使用 $GLOBALS 替代 global。如下面代码所示:
执行结果如下:
![](https://static001.geekbang.org/infoq/e2/e2353303da002066f438a695f1f1c604.png)
在 $GLOBALS 数组中,每一个变量是一个元素,键名对应变量名,值对应变量的内容 $GLOBALS 之所以在全局范围内存在,是因为它是一个超全局变量。关于超全局变量后面我们单独详细介绍。
静态变量
局部变量从存储方式上可分为动态存储类型和静态存储类型,函数中的局部变量,如不专门声明为 static 存储类型,默认都是动态第分配存储空间的,其中的内部动态变量在函数调用结束后自动释放,如果希望在函数执行完毕后,静态本来并不会消失,而是在所有对该函数的调用之间共享,即在函数再次执行时静态变量将接续前次的结果继续运算,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的,需用关键字 static 修饰,static 用法如下:
1.static 放在函数内部修饰变量
2.static 放在类里修饰属性,或方法
3.static 放在类的方法里修饰变量
4.static 修饰在全局作用域的变量
和局部变量相比,静态变量具有一下特点:
当函数执行完毕后,静态变量不会消失
静态变量只能在函数内部使用
静态变量只会被初始化一次
静态变量初始化的值可以省略,默认值为 null
静态变量的初始值只能是具体的字符串、数值等,而不能是一个表达式
注意:在函数外面使用静态变量时并不会报错,这时它的生命周期与作用域和全局变量是一样的;在函数内部定义静态变量时,它的生命周期也和全局变量一样,但是作用域和局部变量的作用域一样的。
静态变量并不是说它的值是不能改变的,不能改变值的那叫常量。 其实静态变量的值是可以改变的,而且它会保持最新的值。之所以称为静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,那么下次函数调用时,这个值是保持不变的
还有一点需要注意的是:静态变量虽然在程序的整个执行过程中始终存在,但是它的作用域和局部变量是一样的,在作用域之外是不能使用的。
如下面代码所示:
执行结果如下:
![](https://static001.geekbang.org/infoq/03/035dd25b358f4ce048bcaa819454a9e2.png)
在上面的例子中,将函数 test()中的局部变量 $one 使用 static 关键字声明为静态变量,并赋初始值 0。函数在第一次执行时,静态变量 $one 经过运算后从初值 0 变为 1。当函数第一次执行完毕后,静态变量 $one 并没有被释放,而是将结果保存在静态内存中。第二次执行时,$one 从内存中获取上一次计算的结果 1,继续运算,并将结果 2 存于静态内存空间中。以后每次函数执行时,静态变量将从自己的内存空间中获取前次的存储结果,并以此作为初值进行计算。也就是说静态变量只在内存空间中开辟一片空间,不管调用多少次都是共享这个内存空间存储的变量。
版权声明: 本文为 InfoQ 作者【迷彩】的原创文章。
原文链接:【http://xie.infoq.cn/article/9397c1655e83d220865e08792】。文章转载请联系作者。
评论