PHP的变量类型和作用域详解

PHP的变量类型和作用域详解

什么是变量的作用域?变量的作用域是指在脚本的一次生命周期内变量的有效范围。一般来说有全局和局部之分

PHP中变量的作用域可以分为:超全局(全局变量的特殊类型,在局部范围里可直接使用),全局,局部,静态(是局部变量的特殊类型)

在PHP中,全局变量实际上是静态全局变量,如果不用unset显式的释放,那么等脚本运行结束全局变量才会被释放掉

局部静态变量细分可以是 局部静态函数变量(函数中声明的static变量),局部静态成员变量(类中声明的 static 属性,被所有类实例共享)

局部静态变量只有脚本运行结束才会被自动释放

超全局变量:在一个脚本的任何作用域里都可以被访问,这些都是PHP内置的

代码如下:

$GLOBALS

$_SERVER

$_GET

$_POST

$_FILES

$_SESSION(持久化存储)

$_COOKIE(持久化存储)

$_REQUEST

$_ENV

全局变量:声明的变量不在class,function,if等语言结构内部,如果要在class,function,if等语言内部使用,需要用关键词global或者超全局变量$GLOBALS

静态变量: 在function中使用关键词static声明的变量,静态变量的值保留直至脚本结束

局部变量:在class,function,if/while/for等结构语句内部声明的变量

1.global关键词和$GLOBALS实例

代码如下:<?php

$a = 0;

function foo()

{

global $a;

echo $a;

}

function foo2()

{

echo $GLOBALS['a'];

}

2.static 变量和普通局部变量区别实例

代码如下:<?php

function foo1()

{

$var = 0;

$var++;

return $var;

}

echo foo1();

echo foo1();

//输出都是1

function foo ()

{

static $var = 0;

$var++;

return var;

}

echo foo();

echo foo();

//第一次输出1 第二次2

3.static 关键词还可以声明静态属性和静态方法

静态属性只能被类调用,而不能被类实例调用

静态方法里不能使用$this,只能用self访问类的静态属性

另外理解static变量的一段代码:

代码如下:

<?php

class t

{

static $v = 10;

public function a()

{

static $var = 10;

$var++;

echo $var . "<br>n";

}

public static function aa()

{

self::$v++;

echo self::$v . "<br>n";

}

}

$o1 = new t();

$o1->a();//输出11

$o2 = new t();

$o2->a();//输出12

t::aa();//输出11

$o1->aa();//输出12

$o2->aa();//输出13

从上面的代码中,可知如果一个类成员方法中有静态变量,即使是不同的类实例,他们也会共享这个静态变量,尽管这个静态变量不是类静态成员变量,这点容易让人迷惑。