① 使用 static 可以将类中的成员标识为静态的,既可以用来标识成员属性,也可以用来标识成员方法,比如:
1 <?php 2 class China 3 { 4 public static $boy = 1;//[修饰词]静态成员属性 5 public static function getboy()//静态成员方法 6 { 7 } 8 } 9 ?>
②类中的静态成员是不需要实例化对象而使用类名来直接输出访问的
类名::静态成员属性名 | 在类的外部和成员方法中都可以使用这种方式访问静态成员属性 |
类名::静态成员方法名( ) | 在类的外部和成员方法中都可以使用这种方式访问静态成员方法 |
在类中声明的成员方法中,也可以使用关键字 "self" 来访问其他静态成员。因为静态成员是属于类的,而不是属于任何对象的,所以不能用$this来引用它,而在PHP中给我们提供的self关键字,就是在类的成员方法中用来代表本类的关键字。
self::静态成员属性名 | 在类的成员方法中使用这种方式访问本类中的静态成员属性 |
self::静态成员方法名( ) | 在类的成员方法中使用这种方式访问本类中的静态成员方法 |
在类的外部访问类中的静态成员,可以使用 对象引用和上述所说的类名方式访问,但通常选择使用类名来访问。如果在类的内部的成员方法访问其他的静态成员,通常使用self的形式去访问,最好不好直接使用类名称访问。例:
1 <?php 2 class Person 3 { 4 static $boy = 1; 5 function nums() 6 { 7 return self::$boy;//使用self访问其他静态成员 8 } 9 } 10 echo Person::$boy; //使用类名访问,输出1 11 $a = new Person(); 12 echo $a->nums();//使用实例化后对象引用,也可输出1 13 ?>
③ static总是唯一存在的
Person类为例,如果在Person类中有一个" $boy_nums=1 "的成员属性(非标识静态),并创建多个对象。任何一个Person类的对象都会拥有自己的一份$boy_name属性,对象之间不会干扰。
1 <?php 2 class Person 3 { 4 public function add_boy() 5 { 6 $boy_nums = 1; 7 return $boy_nums +=1; 8 } 9 } 10 $no1 = new Person(); 11 $no1->add_boy(); 12 $no2 = new Person(); 13 $no2->add_boy(); 14 $no3 = new Person(); 15 $no3->add_boy(); 16 $no4 = new Person(); 17 echo $no4->add_boy();//实例Person到第四个对象时,add_boy()依旧执行了一次 18 ?>
输出:
2
而 static 成员作为整个类的属性存在,如果将$boy_name属性使用static标识,则不管通过Person类创建多少个对象或者没有对象、这个static成员总是唯一存在的,在多个对象之间共用,因为使用static标识的成员是属于类的,所以与对象实例和其他的类无关。类的静态属性非常类似于函数的全局变量。
1 <?php 2 class Person 3 { 4 public static $boy_nums = 1; 5 public function add_boy() 6 { 7 return self::$boy_nums +=1; 8 } 9 } 10 $no1 = new Person(); 11 $no1->add_boy(); 12 $no2 = new Person(); 13 $no2->add_boy(); 14 $no3 = new Person(); 15 $no3->add_boy(); 16 $no4 = new Person(); 17 $no4->add_boy(); 18 echo Person::$boy_nums; 19 ?>
输出:
5 可见 add_boy( ) 相对static静态成员执行了4次
④ 注意:静态方法中只能访问访问静态成员。因为非静态成员都必须通过对象的引用来访问,通常是$this来完成,而静态方法在对象不存在的情况下也可以直接使用类名来访问,没有对象也就没有$this引用,没有了$this引用就不能访问类中的非静态成员,但是可以使用类名或self在非静态方法中访问静态成员
1 <?php 2 class Person 3 { 4 public $girl = 0; 5 public static $boy = 1; 6 public static function nums()//标识静态方法 7 { 8 echo $this->girl;//写法错误,静态方法只能操作静态变量 9 } 10 } 11 Person::nums(); 12 ?>