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
  1. 使用场景

    使用递归时,可以不用传递初始数字

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 静态绑定

  1. 使用 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
  1. 如何让父类 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
posted @ 2020-12-28 11:07  linsonga  阅读(108)  评论(0)    收藏  举报