① 使用 static 可以将类中的成员标识为静态的,既可以用来标识成员属性,也可以用来标识成员方法,比如:

 <?php
     class China
     {
         public static $boy = 1;//[修饰词]静态成员属性
         public static function getboy()//静态成员方法
         {
         }
     }
 ?>

②类中的静态成员是不需要实例化对象而使用类名来直接输出访问的

类名::静态成员属性名 在类的外部和成员方法中都可以使用这种方式访问静态成员属性
类名::静态成员方法名( ) 在类的外部和成员方法中都可以使用这种方式访问静态成员方法

  在类中声明的成员方法中,也可以使用关键字 "self" 来访问其他静态成员。因为静态成员是属于类的,而不是属于任何对象的,所以不能用$this来引用它,而在PHP中给我们提供的self关键字,就是在类的成员方法中用来代表本类的关键字。

self::静态成员属性名 在类的成员方法中使用这种方式访问本类中的静态成员属性
self::静态成员方法名( ) 在类的成员方法中使用这种方式访问本类中的静态成员方法

  在类的外部访问类中的静态成员,可以使用 对象引用和上述所说的类名方式访问,但通常选择使用类名来访问。如果在类的内部的成员方法访问其他的静态成员,通常使用self的形式去访问,最好不好直接使用类名称访问。例:

 <?php
 class Person
 {
     static $boy = 1;
     function nums()
     {
       return self::$boy;//使用self访问其他静态成员
     }
 }
 echo Person::$boy; //使用类名访问,输出1
 $a = new Person();
 echo $a->nums();//使用实例化后对象引用,也可输出1
 ?>

③ static总是唯一存在的

  Person类为例,如果在Person类中有一个" $boy_nums=1 "的成员属性(非标识静态),并创建多个对象。任何一个Person类的对象都会拥有自己的一份$boy_name属性,对象之间不会干扰。

 <?php
 class Person
 {
     public function add_boy()
     {
         $boy_nums = 1;
         return $boy_nums +=1;
     }
 }
 $no1 = new Person();
 $no1->add_boy();
 $no2 = new Person();
 $no2->add_boy();
 $no3 = new Person();
 $no3->add_boy();
 $no4 = new Person();
 echo $no4->add_boy();//实例Person到第四个对象时,add_boy()依旧执行了一次
 ?>

输出:

2

  而 static 成员作为整个类的属性存在,如果将$boy_name属性使用static标识,则不管通过Person类创建多少个对象或者没有对象、这个static成员总是唯一存在的,在多个对象之间共用,因为使用static标识的成员是属于类的,所以与对象实例和其他的类无关。类的静态属性非常类似于函数的全局变量。

 <?php
 class Person
 {
     public static $boy_nums = 1;
     public function add_boy()
     {
         return self::$boy_nums +=1;
     }
 }
 $no1 = new Person();
 $no1->add_boy();
 $no2 = new Person();
 $no2->add_boy();
 $no3 = new Person();
 $no3->add_boy();
 $no4 = new Person();
 $no4->add_boy();
 echo Person::$boy_nums;
 ?>

输出:

5        可见 add_boy( ) 相对static静态成员执行了4次

④  注意:静态方法中只能访问访问静态成员。因为非静态成员都必须通过对象的引用来访问,通常是$this来完成,而静态方法在对象不存在的情况下也可以直接使用类名来访问,没有对象也就没有$this引用,没有了$this引用就不能访问类中的非静态成员,但是可以使用类名或self在非静态方法中访问静态成员

 <?php
 class Person
 {
     public $girl = 0;
     public static $boy = 1;
     public static function nums()//标识静态方法
     {
       echo $this->girl;//写法错误,静态方法只能操作静态变量
     }
 }
 Person::nums();
 ?>

理解Php中的Static的更多相关文章

  1. Java中关于static语句块的理解

    Java中关于static语句块的理解 一.static块会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法. 实例一 public class A{ String name ...

  2. Android 中关于static的使用问题

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5251564.html 项目中,在不停地接收串口数据很长一段时间(几小时)后,会偶然性的报错.初步排除了oom ...

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

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  4. 关于Java中的static关键字

    Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...

  5. 深入理解JDK中的I/O

    深入理解JDK中的I/O 目 录 java内存模型GCHTTP协议事务隔离级并发多线程设计模式清楚redis.memcache并且知道区别mysql分表分库有接口幂等性了解jdk8稍微了解一下特性 j ...

  6. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  7. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

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

    转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...

  9. java中的static详解

    如果一个类成员被声明为static,它就能够在类的任何对象创建之前被访问,而不必引用任何对象.static 成员的最常见的例子是main( ) .因为在程序开始执行时必须调用main() ,所以它被声 ...

随机推荐

  1. 322. Coin Change

    动态规划里例题,硬币问题. p[i] = dp[i - coin[j]] + 1; 注意i < coin[j] dp[i-coin[j]]无解都要跳过. public class Solutio ...

  2. [转]mysql 5.6 存储过程+事务+游标+错误异常抛出+日志写入

    转自:http://www.wolonge.com/post/detail/118249 DELIMITER $$ USE `ecstore`$$ DROP PROCEDURE IF EXISTS ` ...

  3. hibernate性能消耗太狠了。果断减肥引发的连串意外惊喜

    近期在云服务器上新部署了一个项目 硬件配置 CPU: 2核    内存: 4096 MB (I/O优化) 开始是调试测试在用 没发觉,今天我看了下监控 cpu使用率达到了60-70% 而且一直持续 我 ...

  4. MVC URL处理

     需要web.config在system.webServer节点添加  <modules runAllManagedModulesForAllRequests="true"/ ...

  5. BMVC reading list

    'Combining Local and Global Cues for Closed Contour Extraction' Vida Movahedi, James Elder 'FRIF: Fa ...

  6. Android自动关机代码

    http://www.open-open.com/lib/view/open1409209890713.html 要实现自动关机的功能需要手机有root权限,如果手机有root权限,运行该程序时,会提 ...

  7. Visual Studio Package 插件开发

    背景 这段时间公司新做了一个支付系统,里面有N个后台服务,每次有更新修改,拷贝打包发布包"不亦乐乎"...于是我想要不要自己定制个打包插件. 部分朋友可能会认为,有现成的可以去找一 ...

  8. 系统性能优化分析—CPU消耗

    http://blog.csdn.net/longdel/article/details/7296446

  9. 15分钟弄懂 const 和 #define

    什么是const ? 什么是#define? 他们有什么用? 他们有什么区别? 应该怎么用? 总结 1. 什么是const ? const是C/C++中的一个关键字(修饰符), const一般用来定义 ...

  10. NDK开发之获得域和方法描述符

    在NDK开发之调用方法和NDK开发之访问域两篇博客中,我们在获得域ID和方法ID时都需要一个叫做描述符的参数,那么在实际开发中我们怎么知道我们要调用的域或者方法的描述符呢? 一个简单的方法就是使用Ja ...