# static静态属性与静态方法 **静态:** 属于类而不属于单个对象 (全局的,所有对象共享的) **静态属性:** 类的方法内调用静态属性时,不能使用$this->方式,而要使用self::的方式 **静态方法:** 在类没有任何对象的时候也能被调用 当成普通方法来用也没问题的 在静态方法中不能调用普通方法 ## 实例 ~~~ class People { static private $name; public function setname($namec) { self::$name = $namec; } public function getname() { return self::$name; } static public function name($namecc) { echo "I am $namecc"; } static public function getmyname(){ return self::$name; } } $A = new People(); $A->setname("小明 <br/>"); echo $A->getname(); $B = new People(); $B->setname("小智 <br/>"); echo $B->getname(); echo $A->getname(); echo People::name("小霞"); echo "<br/>"; ~~~ **静态成员代码示例** ~~~ class Foo { public static $my_static = 'foo'; public function staticValue() { return self::$my_static; } } class Bar extends Foo { public function fooStatic() { return parent::$my_static; } } print Foo::$my_static . " "; $foo = new Foo(); print $foo->staticValue() . " "; // print $foo->my_static . " "; // Undefined "Property" my_static print $foo::$my_static . " "; $classname = 'Foo'; print $classname::$my_static . " "; // PHP 5.3.0之后可以动态调用 print Bar::$my_static . " "; $bar = new Bar(); print $bar->fooStatic() . " "; ~~~ ## 总结 **静态变量** 静态变量是只存在于函数作用域的变量,不过,在函数执行完成后,这种变量的值不会丢失,也就是说,在下一次调用这个函数时,变量仍然会记得原来的值。要将某个变量定义为静态的,只需要在变量前加上 static 关键字即可。 在类中,static关键字有两种主要用法,一是用来定义静态成员,一是用来定义静态方法。在类的内部,可以使用作用域限定符 (::) 来访问不同层次作用域的变量。 **静态方法** 静态方法和非静态方法之间有一个重要的区别:在调用静态方法时,不再需要拥有类的实例。 静态方法和非静态方法使用原则:一是如果某个方法中不包含$this变量,就应该时静态方法;如果不需要类的实例,可能还应该使用静态类,这样可以免去实例化类的工作。另,在静态方法中时不能使用$this变量的,因为静态方法不属于某个特定的实例。 ## 区别 1. static方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用! 2. 静态方法效率上要比实例化高,静态方法的缺点是不自动进行销毁,而实例化的则可以做销毁。 3. 静态方法和静态变量创建后始终使用同一块内存,而使用实例的方式会创建多个内存。 4. C++中,若类的方法前加了static关键字,则该方法称为静态方法,反之为实例方法。静态方法为类所有,可以通过对象来使用,也可以通过类来使用。但一般提倡通过类名来使用,因为静态方法只要定义了类,不必建立类的实例就可使用。静态方法只能用类的静态成员。