以下所述,静态变量是前缀static关键字的,非静态变量即普通变量。
一、普通静态变量:
1.局部变量在函数完成时就会自动释放,而用static声明的局部变量不会被释放,它的生存周期是全局的,可见性是块内。
2.用static声明的变量会保存上一次被调用的值,即只会被初始化一次,因此static局部变量可以当做全局变量来使用。
这个例子的输出结果为 0,1,2
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
}
myTest();
myTest();
myTest();
?>
二、静态成员变量:
1.静态数据成员变量:
如下述代码:定义一个person类,age变量为静态数据成员变量。
访问静态变量的两种方式:1.类名::变量名 2.对象名::对象名
静态成员变量是属于类的,不属于任何一个对象,因此可以实现对象之间的信息共享,不同实例对象所访问的静态变量是同一个,在一个对象中修改静态变量,别的对象访问的静态变量值也发生改变。
最好使用静态函数访问静态数据。当使用非静态函数访问静态数据成员变量时,应该用非内联函数调用,即在类体中声明,类体外定义的函数。
2.静态函数成员变量:
其基本性质与数据变量成员基本相同,值得注意的是,最好不要用静态函数访问非静态数据,因为非静态数据需要用对象访问,而静态函数可以用类名访问。要使用非静态函数访问非静态数据。
下例是用PHP举例,其他语言的访问去掉$即可。
<?php
class Person{
static $age = 10;
static function des(){
//self:指的是当前的类 $this指的是当前的实例对象
echo "<hr>".self::$age;
}
//构造方法
function __construct(){//只要创建对象,构造方法就会自动执行
echo "对象创建";
}
function __destruct(){//默认程序执行完成后调用析构方法
echo "死亡方法";
}
}
//1.实例化两个对象per1,per2
$per1 = new Person();
$per2 = new Person();
//2.访问静态变量的两种方式:
//1.通过类访问静态变量 ---------
echo Person::$age;
//2.直接通过实例对象访问常量--------
echo $per1::$age;
//3.不同实例对象所访问的静态变量是同一个(共享)
echo $per1::$age;//输出10
echo $per2::$age;//输出10
//所以在一个对象中修改静态变量,别的对象访问的静态变量值也发生改变
$per2::$age=100;
echo $per1::$age;//输出100
//4.释放内存
$per2 = null;
//5.调用静态方法:静态方法不会每个实例都去初始化,类似于原型方法
Person::des();
?>