静态修饰符静态的使用场景有哪些

  介绍

静态修饰符静态的使用场景有哪些?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

<强>一、什么是静态修饰符

许多书和人都喜欢把静态称之为静态,但我不喜欢这样称呼它,我更喜欢直接叫它静态的。因为我认为静态这两个字无法真正表达出静态的真正作用。在程序中任何变量或者成员都是在编译时由系统自动分配内存来存储的,而用静态修饰的成员会存储在一个静态内存区中并且一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。那么这样的设计有什么意义了吗?在面向对象的概念中,这样的设计可是十分有意义的!因为这样的设计,静态可以用来区分成员变量,方法是属于类本身还是属于类实例化后的对象。有静态修饰的成员属于类本身,没有静态修饰的成员属于类的实例。

可能很多人还是不能理解,我在这边快速简单的写个例子吧。

 a {
  公共aa=1美元;
  公共函数aa () {
  $ this→aa +=1;
  echo $ this→aa;
  }
  }
  b类{
  公共函数bb () {
  aaa美元=new ();
  aaa→美元aa ();
  }
  }
  类c {
  公共函数cc () {
  aaa美元=new ();
  aaa→美元aa ();
  }
  }
  bbb美元=new b ();
  ccc美元=new c ();
  bbb→美元bb ();
  回声& # 39;* * * * * * * * * * * * * * * * * * * & # 39;;
  ccc→美元cc (); 

注:在“这→aa"里面的“→”是php调用方法的方式类似于java里面的“管理者”,

上面代码很简单相信大家都能理解,我就不解释了。运行后的结果是2 * * * * * * * * * * * * * * * * * * * 2 .

上面的代码是没用静态的情况,下面我就再写一个用了静态的演示。

 a {
  公共静态aa=1美元;
  公共静态函数aa () {
  自我::$ aa +=1;
  回声self:: $ aa;
  }
  }
  b类{
  公共函数bb () {
  答::aa ();
  }
  }
  类c {
  公共函数cc () {
  答::aa ();
  }
  }
  bbb美元=new b ();
  ccc美元=new c ();
  bbb→美元bb ();
  回声& # 39;* * * * * * * * * * * * * * * * * * * & # 39;;
  ccc→美元cc (); 

注:“self::“和“::“是php中调用静态修饰的成员的方式,里面的差异与本文要探讨的内容关系不大,咱不解释,有兴趣的可以自行研究。

最后的运行结果是2 * * * * * * * * * * * * * * * * * * * 3。这说明了,在静态修饰下的成员变量美元aa在第一次调用后并没有被释放,而是依然存在静态内存块中,所有在第二次调用后输出的结果是3。因为第一次调用后的变量aa从1美元变成了2,第二次调用的时候aa还美元是2,所有二次调用后美元aa变成了3。这就是静态修饰的变量会一直存在的体现。同时,要记住在面向对象的编程中静态修饰的成员不能直接调用非静态修饰的成员。如果你知道了静态的原理这个就很好理解了。拿java举例,用静态修饰的成员,是专门存储在一个静态内存区里面。非静态修饰的成员是存储在堆内存里面。两者是分开存储的,所以要想在静态修饰的成员里面调用非静态修饰的成员,就必须跟在外面调用一样,先实例化,在调用。对于那为什么可以在非静态修饰的成员里面直接调用静态修饰的成员这个问题,我的解释是,你在类外面调用静态成员时不也是可以不实例化类就直接调用吗?更何况在类里面了?

虽然可以在非静态修饰的成员里面直接调用静态修饰的成员,但是我强烈建议大家不要这么做!原因后面会提到。

理解了上面说的,你只是初步了解了静态的,要想更近一步的理解静态,就要读懂这句话:“静态可以用来区分成员变量,方法是属于类本身还是属于类实例化后的对象。有静态修饰的成员属于类本身,没有静态修饰的成员属于类的实例!”很多初学者会搞不懂类和类的实例有什么不同?类是抽象的存在,而类的实例是类具体化的存在。两者是有区别的,因此就会发生一种情况,那就是有些类实例化后没有任何意义,也就是说没有实例化的必要,只有作为类才有意义。这时候,就必须用静态来修饰成员变量和方法,表明这些变量和方法只属于类本身比。如:在做一个项目的时候,一个合格的软件工程师都会封装一个公共方法类,将经常用的公共方法放在里面,以便随时在项目中调用。这时候,你会发现,这个公共方法类,并没有一个合适的具体化的实例可以来表示,只有作为类的时候,才有其意义。所以里面的公共方法都可以用静态来修饰,以表示这些方法都属于类本身,就不需要每一次使用一个公共方法的时候都要实例化出一个具体的对象了。还有就是像做安全防范(sql注入过滤,xss过滤等)的时候,将其统一封装成一个安全类,里面的方法就需要用到静态来修饰,不然难道每一次过滤都要实例化一次吗?再开一个堆内存空间?类似的还有语言包,缓存等等。

静态修饰符静态的使用场景有哪些