您的位置:威尼斯官方网站 > 威尼斯正规官网 > 但是静态变量却不会

但是静态变量却不会

发布时间:2020-01-03 20:56编辑:威尼斯正规官网浏览(148)

    静态变量只设有于函数效能域内,也正是说,静态变量只存活在栈中。常常的函数内变量在函数截止后会释放,譬如部分变量,可是静态变量却不会。正是说,下一次再调用那么些函数的时候,该变量的值会保留下去。

    生龙活虎经在变量前拉长关键字static,该变量就成为静态变量了。

    <?php
      function test()
      {
        static $nm = ;
        $nm = $nm * ;
        print $nm."<br />";
      }
      // 第一次执行,$nm = 
      test();
      // 第一次执行,$nm = 
      test();
      // 第一次执行,$nm = 
      test();
    ?>
    

    程序运维结果:
    1
    2
    2
    4
    3
    8

    函数test(卡塔尔(قطر‎实践后,变量$nm的值都封存了下去了。

    在class中时常应用到静态属性,比方静态成员、静态方法。

    Program List:类的静态成员

    静态变量$nm归于类nowamagic,而不归于类的某些实例。那么些变量对具有实例都使得。

    ::是成效域限制操作符,这里用的是self作用域,实际不是$this作用域,$this功能域只表示类的当下实例,self::表示的是类本身。

    <?php
      class nowamagic
      {
        public static $nm = ;
        function nmMethod()
        {
          self::$nm += ;
          echo self::$nm . '<br />';
        }
      }
      $nmInstance = new nowamagic();
      $nmInstance -> nmMethod();
      $nmInstance = new nowamagic();
      $nmInstance -> nmMethod();
    ?>
    

    程序运维结果:
    1
    3
    2
    5

    Program List:静态属性

    <?php
      class NowaMagic
      {
        public static $nm = 'www.nowamagic.net';
        public function nmMethod()
        {
          return self::$nm;
        }
      }
      class Article extends NowaMagic
      {
        public function articleMethod()
        {
          return parent::$nm;
        }
      }
      // 通过作用于限定操作符访问静态变量
      print NowaMagic::$nm . "<br />";
      // 调用类的方法
      $nowamagic = new NowaMagic();
      print $nowamagic->nmMethod() . "<br />";
      print Article::$nm . "<br />";
      $nmArticle = new Article();
      print $nmArticle->nmMethod() . "<br />";
    ?>
    

    程序运维结果:

    www.nowamagic.net
    www.nowamagic.net
    www.nowamagic.net
    www.nowamagic.net

    Program List:简单的静态构造器

    PHP未有静态布局器,你大概供给开始化静态类,有三个相当粗略的不二秘技,在类定义前面一贯调用类的德姆onstration(卡塔尔国方法。

    <?php
    function Demonstration()
    {
      return 'This is the result of demonstration()';
    }
    class MyStaticClass
    {
      //public static $MyStaticVar = Demonstration(); //!!! FAILS: syntax error
      public static $MyStaticVar = null;
      public static function MyStaticInit()
      {
        //this is the static constructor
        //because in a function, everything is allowed, including initializing using other functions
        self::$MyStaticVar = Demonstration();
      }
    } MyStaticClass::MyStaticInit(); //Call the static constructor
    echo MyStaticClass::$MyStaticVar;
    //This is the result of demonstration()
    ?>
    

    程序运维结果:

    This is the result of demonstration()

    下边给大家介绍PHP静态变量static的使用介绍

    static关键字在C#编制程序中异通常见,它用来修饰符评释归于类型小编并非归属特定目的的静态成员。static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用来索引器、析构函数或类以外的类型。注解为static的类、函数和变量将不能够引用实例方法或变量,别的在C#中倘使类被增添了static修饰符,则其内部有着变量和章程都必须要是静态的。静态变量和措施必得经过类名举行引用而无法因而实例对象引用。

    那么static关键字在php中与C#中皆有些什么两样啊?

    宣示范围

    相对C#来讲,PHP中static变量的施用范围要更广一些,大家不光能够在类,方法或变量前面加多static修饰符,大家如故还是能给函数内部变量增加static关键字。增加了static修饰符的变量纵然在该函数实施完结值照旧不会丢弃,也正是说,在下一遍调用这一个函数时,变量照旧记得原本的值。如:

    <?php
    function test()
    {
      static $var=;
      $var+=;
      echo $var.' ';
    }
    test();
    test();
    test();
    ?>
    

    运作结果如下:

    3 5 7

    此地有好几亟待注意的是,变量的赋值操作只会在变量第贰回初阶化时会被调用,在现在函数的实践进程中,那一个操作不会被调用。

    出于PHP中函数相似是一等百姓,所以差别于C#,我们得以平素定义函数,并直接在代码的其它省方调用,那或多或少跟javascript倒是有个别雷同。由此那时候候函数静态变量会比定义全局变量越发有用,它可防止止变量重复定义引致冲突。而由于C#中函数不只怕直接定义和调用,它必需寄宿在类中,所以只要函数须求静态变量,大家只需求在类中定义便能完毕平等效果。

    调用情势

    C#中,大家调用静态成员的方法特别轻易和少年老成致,因为静态成员不归属实例对象,所以不管方法依然变量,C#对其静态成员的访谈方式一概是透过类名.方法(变量卡塔尔进行。何况在C#中,静态函数是不能够被设置为虚方法大概覆盖的。而PHP对此则提供了越来越灵活各个的扶持。

    首先,大家领悟PHP中调用实例方法都以经过如:someobj->someFun(卡塔尔调用,那么大家调用静态函数是不是也能像C#那么通过SomeClass->someFun(卡塔尔调用呢?答案是不是认的,在PHP中,对静态成员的调用只好通过::的诀窍展开,如:SomeClass::someFun(卡塔尔(قطر‎。

    <?php
    class TestC
    {
      public static $var=;
      public $var=;
      function t()
      {
        self::$var+=;
        echo self::$var.' ';
        echo $this->var.' ';
      }
      public static function t()
      {
        self::$var+=;
        echo self::$var.' ';
      }
    }
    $t=new TestC();
    $t->t();
    TestC::t();
    ?>
    

    运作结果如下:

    3 1 5

    除此以外一些和C#中不相同的是,在类中的方法中,如若大家必要调用静态变量,必需透过self::$somVar静态变量(注意变量后面包车型大巴$符号,实例变量没有需求State of Qatar,而调用静态方法规为self::someFun(State of Qatar(这里不需求$符号卡塔尔(قطر‎。如上例。

    另外,与C#最大的差别之处正是,PHP中,子类是足以覆盖父类的静态函数或变量的,不止如此,(站在C#工程师的角度来看,笔者认为PHP那点反而将业务搞复杂了卡塔尔(قطر‎,由于暗中同意self::staticFun(State of Qatar调用的是子类的静态函数,那时候假设咱们想调用父类的静态变量如何做呢?这里PHP提供了附加的parent来调用基类的静态成员。如:

    <?php
    class TestC
    {
      public static $var=;
      public $var=;
      function t()
      {
        self::$var+=;
        echo self::$var.' ';
        echo $this->var.' ';
      }
      public static function t()
      {
        self::$var+=;
        echo self::$var.' ';
      }
    }
    $t=new TestC();
    $t->t();
    TestC::t();
    ?>
    

    运行结果如下:

    3 5 ‘Hello'

    最棒,依据上面的例证大家相当轻便想到,子类访谈父类能够利用parent关键字,那么父类如何访谈子类的静态方法呢?这里给出static的其它叁个用法,这里如若将调用的静态方法后面包车型大巴效率域换来static的话,PHP会根据此类的持续档案的次序来计算最后的静态方法。如:

    <?php
    class Test
    {
      function t()
      {
        static::t();
      }
      public static function t()
      {
        echo self::'Test ';
      }
    }
    class Test extends Test
    {
      static function t()
      {
        echo self::'Test ';
      }
    }
    $t=new Test();
    $t->t();
    Test::t();
    ?>
    

    运转结果如下:

    Test2 Test2

    那边t实例在t1方法调用t2静态方法时,会依赖实际例找到最后的静态方法并出口Test2。

    总结

    从地方的剖判,大家轻松看出,对于静态成员的施用,PHP提供了比C#越是有力的效应或灵活性,但从自个儿的角度来看,这种灵活性不见得就越来越好,从某种角度来看,若是类的一而再再三再四等级次序过于复杂,它或者会让笔者爆发模糊。当然,同样的工具分歧人利用效用会全盘不相似,既然PHP提供了更数不清的挑精拣肥,那么相信只要应用合适的话,PHP中的static大概会提供比C#中国和越南社会主义共和国来越强大而方便的应用办法。

    本文由威尼斯官方网站发布于威尼斯正规官网,转载请注明出处:但是静态变量却不会

    关键词: