static关键字声明一个属性或方法是和类相关的,而不是和类的某个特定的实例相关,所以,这类属性或方法也称为“类属性”或“类方法”。static的属性,在内存中只有一份,为全部的实例共用的静态属性。php
若是访问控制权限容许,可没必要建立该类对象而直接使用类名加两个冒号“::”调用,使用self:: 关键字访问当前类的静态成员。this
static 的属性和方法,只能访问static的属性和方法,不能类访问非静态的属性和方法。由于静态属性和方法被建立时,可能尚未任何这个类的实例能够被调用。spa
。code
一个类的全部实例,共用类中的。对象
也就是说,在内存中即便有多个实例,静态的属性也只有一份。内存
单例模式get
<?php class Single_Service { private static $Singleton; public static function getSingleton() { if (empty ( self::$Singleton)) { if(empty(self::$Singleton)){ self::$Singleton = new Single_Service (); } } return self::$Singleton; } .... } ?>
static 后期静态绑定io
<?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
以上代码输出 A ,可是若是但愿输出 Bfunction
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 这里有变化,后期静态绑定从这里开始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test(); ?>
后期静态绑定本想经过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字可以让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。class
class A { public static function get_self() { return new self(); } public static function get_static() { return new static(); } } class B extends A {} echo get_class(B::get_self()); // A echo get_class(B::get_static()); // B echo get_class(A::get_static()); // A
self - 就是这个类,是代码段里面的这个类。
static - PHP 5.3加进来的只得是当前这个类,有点像$this的意思,从堆内存中提取出来,访问的是当前实例化的那个类,那么 static 表明的就是那个类。