美文网首页
static 关键字

static 关键字

作者: Leonzai | 来源:发表于2018-05-16 14:42 被阅读9次

静态变量

最基本的知识

function test()
{
    static $a = 0;
    echo $a;
    $a++;
}

/**
如果没有 static 关键字,在第一次运行完 test 函数的时候,$a 就被销毁了。
第二次运行函数时候,会被重新赋值为 0 。

存在 static 关键字,第一次运行完函数,$a 的值并不会被销毁。
第二次运行函数的时候,会去内存 static 区域中查找 $a 是否存在,存在就不再赋值了。
*/

连续声明会报错

<?php
function foo(){
    static $int = 0;          // correct
    static $int = 1+2;        // wrong  (as it is an expression)
    static $int = sqrt(121);  // wrong  (as it is an expression too)

    $int++;
    echo $int;
}

后期静态绑定

<?php
class a{
    static protected $test="class a";

    public function static_test(){
        echo static::$test; // Results class b
        echo self::$test; // Results class a
    }
}

class b extends a{
    static protected $test="class b";
}

$obj = new b();
$obj->static_test();
<?php
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();      // A
        static::who();    // B
    }
}

class B extends A {
    public static function who() {
        echo __CLASS__;
    }
}

B::test();

理解继承

<?php
class A {
    private function foo() {
        echo "success!\n";
    }
    public function test() {
        $this->foo();
        static::foo();
    }
}

class B extends A {
   /* foo() will be copied to B, hence its scope will still be A and
    * the call be successful */
}

class C extends A {
    private function foo() {
        /* original method is replaced; the scope of the new one is C */
    }
}

$b = new B();
$b->test();             // success success
$c = new C();
$c->test();         // success 不能再 A 中访问 C 的私有方法

复杂的例子


<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();

// 输出 ACC
// 总结,无论在静态绑定前调用的是 self,parent,还是什么乱七八糟的,最终返回的都是一开始调用的 类。

总结,无论在静态绑定前调用的是 self,parent,还是什么乱七八糟的,最终返回的都是一开始调用的 类。

相关文章

  • OC中static、const、extern关键字理解

    static关键字 static关键字用于修饰变量。 static修饰局部变量当使用static修饰局部变量时, ...

  • static关键字

    Static关键字概述 static(静态)关键字可以用于修饰变量、方法和代码块。我认为static关键字的主要用...

  • 【Java】关键字

    一、 static关键字 static关键字的总结: static关键字 可以再没有创建对象的时候进行调用类的元素...

  • Java学习Day03

    今日学习内容总结 Static关键字 Arrays类 Math类 继承 Static关键字 一旦用了static,...

  • java基础-day11-static关键字

    static关键字和接口 1. static关键字【重点】 1.1 static修饰静态成员变量 1.1.1 为什...

  • C语言中的static关键字

    @TOC C语言中的static关键字 static 关键字,意为静态。 static 变量 特性:全局变量在函数...

  • Static关键字

    C语言中的static关键字和Java的static关键字意义不一样。 1 用static修饰函数 static用...

  • C基础知识

    基础问题 1.static关键字和const关键字。 static: 作用于变量时:用static声明局部变量--...

  • 13.面向对象进阶—静态关键字static

    面向对象进阶 静态关键字static static关键字的作用,修饰成员变量的用法 static是静态的意思,可以...

  • Java学习13:static关键字,this关键字

    static关键字 static翻译为“静态的”。所有static关键字修饰的都是类相关的,类级别的。所有stat...

网友评论

      本文标题:static 关键字

      本文链接:https://www.haomeiwen.com/subject/mvepdftx.html