写点什么

【web 开发基础】PHP 变量的作用范围 (29)

作者:迷彩
  • 2022-11-21
    广东
  • 本文字数:2395 字

    阅读完需:约 8 分钟

前言

变量的作用范围也就是他的生效范围。大部分的 PHP 变量只有一个单独的使用范围,也包含了 include 和 require 引入的文件。当一个变量执行赋值的动作后,会随着声明区域的位置差异而有不同的使用范围。大致上说,变量会依据声明的位置分为局部变量和全局变量两种。


局部变量

局部变量也称为内部变量,是在函数内部声明的变量,其作用域仅限于函数内部,离开这个函数后再使用这种变量是非法的。不仅在函数中声明的变量是局部变量,为声明函数设置的参数因为只能在本函数内部使用,所以也是局部变量。区别在于函数的参数具体数值从函数外部获得(函数被调用时传入的值),而直接在函数中声明的变量只能在函数内部被赋值。但他们的作用域都仅限于函数内部,因为当每次函数被调用时,函数内部的变量被声明,执行完毕后函数内部的变量都被释放。如下代码所示:

<?php
function test($one){ $two = 100; echo "函数内部执行:$one+$two=".($one+$two)."\n";}
test(300);echo "在函数外部执行:$one+$two=".($one+$two)."\n";
复制代码

执行结果如下:


在上面的例子中,声明了一个 test()函数,当调用 test()时才会声明两个变量 $one 和 $two,这两个变量都是局部变量。变量 $one 是在参数中声明的并在调用时被赋值 300,另一个变量 $two 是在函数中声明的并直接赋值 100,这两个局部变量只能在函数的内部使用,输出计算结果。当 test()函数执行结束时,这两个变量就会被释放。因此在函数外部访问这两个变量时时不存在的,所以没有输出结果。如果在函数外部需要调用该变量值,必须通过 return 指令将其值传回至主程序区块以做后续处理。如下所示:

<?php
function test($one){ $two = 100; return $one+$two;}
$sum = test(300);echo "在函数外部执行:$ one + $ two= ".$sum."\n";
复制代码

执行结果如下:


全局变量

全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。和其他编程语言不同,全局变量不是自动设置为可用的。在 PHP 中,由于函数可以视为单独的程序片段,所以局部变量会覆盖全局变量的能见度,我平时会把它称为就近原则。因此在函数中无法直接调用全局变量。


<?php$one = 200;$two = 100;
function test(){ echo "函数内部执行结果:$ one+$ two=".($one+$two)."\n";}
test();
复制代码

执行结果:


在上面的例子中,函数 test()外面声明了两个全局变量 $one 和 $two,但在 PHP 中,不能直接在函数中使用全局变量。所以在 test()函数中使用的变量 $one 和 $two,相当于新声明的两个变量,并没有被赋初值,是两个空值运算,所以得到的结果为 0.在函数中若使用其全局变量,必须要利用 global 关键字定义目标变量,以告诉函数主体此变量为全局变量。如下面代码所示:

<?php$one = 200;$two = 100;
function test(){ global $one,$two; echo "函数内部执行结果:$ one+$ two=".($one+$two)."\n";}
test();
复制代码

执行结果如下:


在函数中使用全局变量,除了使用关键字 global,还可以使用特殊的 PHP 自定义 GLOBALS 数组。前面的例子的写成使用 $GLOBALS 替代 global。如下面代码所示:

<?php$one = 200;$two = 500;
function test(){ $GLOBALS['two'] = $GLOBALS['one'] + $GLOBALS['two'];}
test();echo "计算结果:".$two;
复制代码


执行结果如下:


在 $GLOBALS 数组中,每一个变量是一个元素,键名对应变量名,值对应变量的内容 $GLOBALS 之所以在全局范围内存在,是因为它是一个超全局变量。关于超全局变量后面我们单独详细介绍。

静态变量


局部变量从存储方式上可分为动态存储类型和静态存储类型,函数中的局部变量,如不专门声明为 static 存储类型,默认都是动态第分配存储空间的,其中的内部动态变量在函数调用结束后自动释放,如果希望在函数执行完毕后,静态本来并不会消失,而是在所有对该函数的调用之间共享,即在函数再次执行时静态变量将接续前次的结果继续运算,并且仅在脚本的执行期间函数第一次被调用时被初始化。要声明函数变量为静态的,需用关键字 static 修饰,static 用法如下:

1.static 放在函数内部修饰变量

2.static 放在类里修饰属性,或方法

3.static 放在类的方法里修饰变量

4.static 修饰在全局作用域的变量

和局部变量相比,静态变量具有一下特点:

  1. 当函数执行完毕后,静态变量不会消失

  2. 静态变量只能在函数内部使用

  3. 静态变量只会被初始化一次

  4. 静态变量初始化的值可以省略,默认值为 null

  5. 静态变量的初始值只能是具体的字符串、数值等,而不能是一个表达式


注意:在函数外面使用静态变量时并不会报错,这时它的生命周期与作用域和全局变量是一样的;在函数内部定义静态变量时,它的生命周期也和全局变量一样,但是作用域和局部变量的作用域一样的。

静态变量并不是说它的值是不能改变的,不能改变值的那叫常量。 其实静态变量的值是可以改变的,而且它会保持最新的值。之所以称为静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,那么下次函数调用时,这个值是保持不变的


还有一点需要注意的是:静态变量虽然在程序的整个执行过程中始终存在,但是它的作用域和局部变量是一样的,在作用域之外是不能使用的。


如下面代码所示:

<?php
function test(){ static $one = 0; echo $one."\n"; $one++;}
test();test();test();test();
复制代码

执行结果如下:


在上面的例子中,将函数 test()中的局部变量 $one 使用 static 关键字声明为静态变量,并赋初始值 0。函数在第一次执行时,静态变量 $one 经过运算后从初值 0 变为 1。当函数第一次执行完毕后,静态变量 $one 并没有被释放,而是将结果保存在静态内存中。第二次执行时,$one 从内存中获取上一次计算的结果 1,继续运算,并将结果 2 存于静态内存空间中。以后每次函数执行时,静态变量将从自己的内存空间中获取前次的存储结果,并以此作为初值进行计算。也就是说静态变量只在内存空间中开辟一片空间,不管调用多少次都是共享这个内存空间存储的变量。

发布于: 刚刚阅读数: 7
用户头像

迷彩

关注

我的工作是常年写bug|公众号:编程架构之美 2020-06-18 加入

修bug的菜鸟~公众号:“互联网有啥事”已改名为“编程架构之美”

评论

发布
暂无评论
【web 开发基础】PHP 变量的作用范围  (29)_作用域_迷彩_InfoQ写作社区