php 中的 static
1. static 使用
准备一个类,有静态变量、静态方法、普通方法
class Test {
static $v = 'a';
static function showV() {
echo self::$v;
}
function showVV() {
echo self::$v;
}
static function showVVV() {
// $this->showVV(); // 会直接报错
}
}
// 实例化类,开始测试
$t = new Test();
$t->showV();
//echo $t->v; // 报异常。 调用静态方法可以,但属性不可
echo Test::$v;
//Test::showVV(); // 报异常。 用静态方法调用普通方法不可
$t->showVV();
3. 初始化特性
静态属性是 运行时 计算的,只在第一次赋值 的时候是真正的赋值操作,而后不会进行赋值,可以相当于这一行代码(static $a = 1;)不存在
class Calculate {
function cacl() {
static $a = 1;
echo $a;
$a++;
}
}
$calculate = new Calculate();
$calculate->cacl(); // 1
$calculate->cacl(); // 2
$calculate->cacl(); // 3
-
使用场景
使用递归时,可以不用传递初始数字
function test1() {
static $count = 0;
$count++;
echo $count;
if ($count < 10) {
test();
}
$count--;
}
test1();
3. static 引用对象问题
赋值的是内存引用地址。但是同样的原因,静态属性是运行时产生的,而引用地址不是静态地存储,于是赋不上值了
不可以把引用值赋给静态变量
class Foo {
public $a = 1;
}
function getRefObj($o) {
static $obj;
var_dump($obj);
if (!isset($obj)) {
$obj = &$o; // 引用赋值
}
$obj->a++;
return $obj;
}
function getNoRefObj($o) {
static $obj;
var_dump($obj);
if (!isset($obj)) {
$obj = $o; // 普通赋值
}
$obj->a++;
return $obj;
}
$o = new Foo;
$obj1 = getRefObj($o); // NULL
$obj2 = getRefObj($o); // NULL
$obj3 = getNoRefObj($o); // NULL
$obj4 = getNoRefObj($o); // Foo
4. static 静态绑定
-
使用 B 类调用 test() 方法,结果是什么
self是取决于当前定义方法所在的类
class A {
static function who() {
echo __CLASS__ . "\n";
}
static function test() {
self::who(); // 使用 self
}
}
class B extends A {
static function who() {
echo __CLASS__ . "\n";
}
}
B::test(); // A
-
如何让父类 AA 中 test() 方法去调用到子类的 who() 方法
static表示运行最初时的类,不是方法定义时的类
class AA {
static function who() {
echo __CLASS__ . "\n";
}
static function test() {
static::who(); // 使用 static
}
}
class BB extends AA {
static function who() {
echo __CLASS__ . "\n";
}
}
BB::test(); // BB

浙公网安备 33010602011771号