今天上网查了下php的static关键字,得到了一些理解,特地写出来以供大家参考指点。
一,static 声明变量用法。
1. 用static关键字声明的变量跟其他局部变量不同之处在于:static声明的变量在局部范围内只会初始化一次,当执行完局部操作之后到下次使用这个变量之前,最近一次的值都会被保留 ( 即使再次经过了初始化此变量的代码,其值也不会被重新初始化,还是会保留最近一次的值 )。
例如:
function test_static(){
static $sta = 2;echo $sta++;
}
test_static(); //输出 2
test_static(); //输出 3
2.就像其它所有的PHP静态变量一样,静态属性只能被初始化为一个字符值或一个常量,不能使用表达式。 所以你可以把静态属性初始化为整型或数组,但不能指向另一个变量或函数返回值,也不能指向一个对象。
function test_static(){
static $sta = 2 + 1 ; // ( ! ) Parse error: syntax error, unexpected '+', expecting ',' or ';' static $sta = int(2); // 错同上。
echo $sta++;
}
3.
声明类成员(属性)或方法为static,就可以不实例化类而直接访问。不能通过一个对象来访问其中的静态成员( 静态属性不可以由对象通过->操作符来访问 ),但是可以访问静态方法。
为了兼容PHP4,如果没有指定“可见性”,属性和方法默认为public。
由于静态方法不需要通过对象即可调用,所以伪变量$this在静态方法中不可用。
用::方式调用一个非静态方法会导致一个E_STRICT级别的错误。
class parentclass{
static $pname = 'xk';
static function lg(){
echo self::$pname;
}
}
class childclass extends parentclass{
static $cname = 'test';
static function lp(){
echo parent::lg();
}
}
$pc = new parentclass().'<br>';
//echo $pc->$pname; // 错误
echo $pc->lg();
echo childclass::lp();
另外,还有一些有关静态方法的总结如下:
1.static关键字可以用来修饰变量、方法(静态方法);
2.不经过实例化,在当前类中就可以直接使用 "类名::静态属性名/方法名" 或者 "self::静态属性名/方法名"(当前类中推荐后者,这样当类名改变的时候更方便,如果在其他类中调用,就需要是类名::方法名)去访问类中static的属性和方法。
3.在类中我们不能使用this关键来访问静态属性,因为静态属性在对象可能还没有实例化之前已经存在。