加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_潮州站长网 (http://www.0768zz.com/)- 物联安全、建站、操作系统、云计算、数据迁移!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP中什么是静态?深入了解静态属性和静态技巧

发布时间:2022-07-12 13:17:59 所属栏目:PHP教程 来源:互联网
导读:静态是什么? 我们之前讲到, 调用成员变量和方法, 都需要用到对象. 但如果我们不想实例化, 直接访问变量和方法呢? 这就用到了静态static功能. 在定义变量和方法的时候, 在前面加上static关键词, 就转化为了静态, 就可以通过类名::双引号直接进行访问. 我们继
  静态是什么?
  我们之前讲到, 调用成员变量和方法, 都需要用到对象. 但如果我们不想实例化, 直接访问变量和方法呢? 这就用到了静态static功能.
 
  在定义变量和方法的时候, 在前面加上static关键词, 就转化为了静态, 就可以通过类名::双引号直接进行访问.
 
  我们继续将上面的例子改写为静态变量和静态方法:
  
  class Classname          //定义一个类, 类名不区分大小写
 
  {
 
  static public $name;      //定义静态成员变量;
 
  static public $height=180;    //初始化赋值
 
  static public $weight, $nationality; //可以一个语句定义多个变量
 
  static protected $age;
 
   
 
  static public function player($name,$height, $weight, $age, $sex)
 
  {                    //定义静态成员方法, 以及方法形参
 
      self::$name=$name;                 //为成员变量赋值, 使用了代词self::
 
      self::$weight=$weight;
 
      self::$height=$height;
 
   
 
      if (self::$height<185 && self::$weight<=85){
 
          return self::$name.',符合要求';
 
      }else{
 
          return self::$name.',不太行';
 
      }
 
  }
 
  }
 
  echo Classname::$height;              //180, 通过类名::访问静态变量
 
  echo Classname::player('xiaoming',180,80,22, 'Male');  //通过类名::访问静态方法;
 
  上面的例子可以注意到, 我将所有的$this都换成了self. 因为$this指代的是调用对象, 而self指代的方法所在的类本身. 静态方法可以通过类名::直接调用, 这里没有对象, $this指代的就为空, 系统就会报错. 所以静态方法内调用变量, 不能通过$this.
 
  注意self::后面的变量要有$符号.
 
  静态的本质
  不要小瞧这个static, 加上了它, 其实不只是可以直接调用这么简单, 成员变量和方法的意义发生了本质上的变化:
 
  在静态方法中只能调用静态变量, 而不能调用普通变量, 普通方法则可以调用静态变量. 这是由静态方法的属性决定的, 因为普通的成员变量是与"对象"绑定的, 而静态变量是与"类"绑定的.
 
  我再详细解释一下静态变量和普通变量的区别:
 
  普通的成员变量与对象绑定, 不同的对象都有一套属于自己的成员变量. 不同对象的成员变量都有各自的赋值, 虽然有可能相同, 但你的就是你的.
 
  静态变量是和类绑定的. 如果静态变量改变了, 那么这个类所有的对象中, 这个值都会发生改变.
 
  静态变量也可以通过对象::来进行访问, 但其实同一个类的对象访问的其实都是同一个静态变量值. 可以理解为静态变量是整个类共享的, 包括它的子类.
 
  所以即便其中一个对象被销毁了, 静态变量值还会保留.
 
  子类也可以重写父类的静态成员变量, 但父类的静态变量依然存在, 这两个静态成员变量是独立的. 会根据调用的类名分别进行访问.
 
  我们举个例子:
 
  
  class Shouji
 
  {
 
      static public $test;           //定义一个静态变量
 
      static function test5()        //定义静态方法来操作并输出静态变量
 
      {
 
          self::$test++;
 
          echo self::$test;
 
      }
 
  }
 
  class Shouji2 extends  Shouji          //定义一个子类
 
  {
 
      static function test5()           //定义子类的静态方法
 
      {
 
          self::$test++;                 //访问并操作父类的静态变量
 
          echo self::$test;
 
      }
 
  }
 
  $shouji1=new Shouji;               //新建父类对象
 
  $shouji1->test5();     //1, 通过对象调用静态方法
 
  $shouji2=new Shouji;   //新建另一个父类对象
 
  $shouji2->test5();    //2,  在前一次操作基础上继续+1
 
  $shouji3=new Shouji2;    //新建子类对象
 
  $shouji3->test5();    //3, 调用子类同名静态方法, 继续+1
 
  echo Shouji::$test;    //3, 通过父类::直接访问静态成员变量
 
  echo $shouji1::$test;   //3, 通过对象名::可以直接访问静态成员变量
 
  通过上面这个例子, 我们还能有以下几点总结:
 
  子类可以重写父类的静态方法.
 
  方法内访问静态变量需要用::符号. 不能用$this;
 
  静态方法和静态变量都会被子类继承.
 
  静态变量不能由->访问, 而是由 ::(双冒号)进行访问
 
  对象可以通过对象名->来直接调用静态成员方法, 这个和调用普通方法是一样的.

(编辑:我爱制作网_潮州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读