理解Php中的Static

① 使用 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 ?>
时间: 2024-09-29 18:51:41

理解Php中的Static的相关文章

C++ 类模板三(类模版中的static关键字)

//类模版中的static关键字 #include<iostream> using namespace std; /* 类模板本质上是c++编译器根据类型参数创建了不同的类, c++编译器在利用类模板生成类的时候会为每个类生成一个static变量 那么对于类中的static关键字就非常好理解了 static关键字修饰的变量是属于类的 同一个类的对象共享类的static静态变量 类模板中的static修饰的变量数据类型必须是确定的 不可以是类型参数 因为静态变量在类对象之前初始化 这时候还没有通

(转)Java中的static关键字解析

转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: "static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途." 这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键

Java中的static关键字解析

http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法.这实际上正是static方法的主要用途.” 这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句

深入理解css中的定位属性:position

深入理解css中的定位属性:position 在网页设计中,position属性的使用是非常重要的.有时如果不能认识清楚这个属性,将会给我们带来很多意想不到的困难. position属性共有四种不同的定位方法,分别是static.fixed.relative.absolute. 第一部分:static static定位是HTML元素的默认值,即没有定位,元素出现在正常的流中,因此,这种定位就不会收到top,bottom,left,right的影响. 如html代码如下: <div class=&qu

java中的static详解

如果一个类成员被声明为static,它就能够在类的任何对象创建之前被访问,而不必引用任何对象.static 成员的最常见的例子是main( ) .因为在程序开始执行时必须调用main() ,所以它被声明为static. 声明为static的变量实质上就是全局变量.当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量,例如:声明一个static的变量count作为new一个类实例的计数.声明为static的方法有以下几条限制: 1.它们仅能调用其他的s

java中的static

Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnb

编写高质量代码改善C#程序的157个建议——建议44:理解委托中的协变

建议44:理解委托中的协变 委托中的泛型变量天然是部分支持协变的.为什么是“部分支持协变”?看下面示例: class Program { public delegate T GetEmployeeHanlder<T>(string name); static void Main() { GetEmployeeHanlder<Employee> getAEmployee = GetAManager; Employee e = getAEmployee("Mike"

【转】Java中的static关键字解析

Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “static方法就是没有thi

理解java中的ThreadLocal(转)

一.对ThreadLocal概术 JDK API 写道: 该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本.ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联. 二.结合源码理解 可以看到ThreadLocal类中的变量只有这3个int型: private f