作用域
变量(常量)能够被访问的区域,变量可以在常规代码中定义,也可以在函数内部定义
变量的作用域
在 PHP 中作用域严格来说分为两种,但是 PHP内部还定义一些在严格意义之外的一种,所以总共算三种——
- 局部变量:在函数内部定义的变量(函数形参也属于函数内部),只允许在当前函数内部使用
- 全局变量:在常规代码中定义的变量(函数外部定义),函数内部不可以直接使用
- 超全局变量:系统定义的变量(预定义变量:$_GET,$_POST,$GLOBALS等),没有访问限制(函数内外都可以访问)
(下图通过一个脚本举例了三种变量,请看注释描述!)
局部和全局的联系
通过$GLOBALS联系局部和全局
全局变量和超全局变量有一个特殊联系,即$GLOBALS,所有的全局变量都会被存放在这个系统预定义变量中,它是一个数组,即使在函数内部也可以通过它来间接访问到全局变量
(虽然常规开发一般不用这种方式,但是这个知识点可以作为渗透测试利用)
通过引用(址)传递联系局部和全局
在上一篇中提过的函数参数传递,就是一种最常规的联系局部和全局的方式
- 值传递可以实现在函数内部间接访问全局变量,但不能改变全局变量(即实参)的值(因为形参是实参的一份拷贝)
- 引用(址)传递则直接实现了在函数内部既能访问全局、又能改变全局
通过global关键字定义局部变量,联系局部和全局
在函数内部(局部)用global关键字定义一个变量(定义时不能赋值!),将赋予该变量全局属性,前提是该函数要先被调用且正常运行到定义该变量的代码
此时如果已经存在一个同名的全局变量,那么这个局部变量就直接成为这个同名全局变量
静态变量
静态变量在各种编程语言都有存在,本来这个系列只打算记录php相对其它编程语言比较特殊的知识,来达到一个快速入门php基础的目的,但静态变量我将其作为一个重难的知识点,因此在此处也额外记录一下
概念
静态变量是在编程中用于存储固定值或者在整个程序执行过程中保持其值不变的变量。在许多编程语言中,静态变量通常与类或函数相关联,可以被所有实例或调用该函数的地方共享。这意味着,即使创建了多个对象或调用了多次函数,静态变量的值也只有一个,并且在程序执行期间保持不变
在C++中,静态变量通过使用
static
关键字来声明。在Java中,静态变量也使用static
关键字来声明,通常位于类级别。在Python中,静态变量通常是通过在类内部定义的类变量实现的,但是Python没有严格的静态变量概念,因为它们不会像其他语言中那样保持严格的不变性。而php的静态变量和C++中的 静态变量基本属于完全相同的一个概念举例说明
在下图这个例子中,函数test定义了一个普通变量$a,和一个静态变量$b,调用三次test函数,每次调用输出a和b的值,不难看出,每次调用test函数时,a都被重新赋值为1,而b则未被重新赋值
这正是因为:静态变量在脚本编译时就被赋了初始值,此后脚本在运行到静态变量的定义代码时,会直接跳过(也就不会重新赋值了)