A: 函数内的static变量
static静态变量的理解
静态变量 类型说明符是static。
静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在 静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直 到整个程序运行结束(相反,而auto自动变量,即动态局部变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放)。静态变量虽在程序的整个执 行过程中始终存在,但是在它作用域之外不能使用。
另外,属于静态存储方式的量不一定就是静态变量。 例如:外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
所有的全局变量都是静态变量,而局部变量只有定义时加上类型修饰符static,才为局部静态变量。
静态变量可以在任何可以申请的地方申请,一旦申请成功后,它将不再接受其他的同样申请。
静态变量并不是说其就不能改变值,不能改变值的量叫常量。 其拥有的值是可变的 ,而且它会保持最新的值。说其静态,是因为它不会随着函数的调用和退出而发生变化。即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。
如下示例:
function func1() {
static
count=0;//初始化静态变量,所有函数共享一个静态变量
count
count++;//注意这个累加的过程,每调用一次本函数,
count累加1
echo $count . “
”;
}
/输出12345678910/
for(
i=0;
i < 10; $i ++){
func1 ();
}
echo “
”;
function func2() {
count=0;
count ++;
echo $count . “
”;
}
/输出1111111111/
for(
i=0;
i < 10; $i ++){
func2 ();
}
B:静态方法
静态函数最大的好处就是类不经过实例化就可以直接实用.但它不能访问类的非静态成员变量和成员函数.
Class Person{
// 定义静态成员属性
public static country = “中国”;
// 定义静态成员方法
public static function myCountry() {
// 内部访问静态成员属性
echo “我是”.self::$country.”人 ”;
}
}
class Student extends Person {
function study() {
echo “我是”. parent::$country.”人 ”;
}
}
// 输出成员属性值
echo Person::country.”
”; // 输出:中国
p1=newPerson();//echo
p1->country; // 错误写法
// 访问静态成员方法
Person::myCountry(); // 输出:我是中国人
// 静态方法也可通过对象访问:
p1−>myCountry();//子类中输出成员属性值echoStudent::
country.”
”; // 输出:中国
t1=newStudent();
t1->study(); // 输出:我是中国人
以下是个更简单的实例
class test
{
protected static test = ‘222’;
public static function test2()
{
echo self::test;
}
}
echo test::test2();
静态函数可以直接test::test2();这样调用,而且静态函数可以直接访问类的静态变量.