静态方法效率上要比实例化高,静态方法的缺陷是不自动进行销毁,而实例化的则可以做销毁。

静态方法和静态变量创建后始终利用同一块内存,而利用实例的办法会创建多个内存。

static全局变量和普通全局变量,static局部变量和普通局部变量,static函数与普通函数的差异?

静态绑定php深刻懂得php static变量办法    static后期静态绑定 Java

(1)全局变量(外部变量)的解释之前再冠以static 就构成了静态的全局变量。
全局变量本身便是静态存储办法, 静态全局变量当然也是静态存储办法。
这两者在存储办法上并无不同。
这两者的差异在于非静态全局变量的浸染域是全体源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。
而静态全局变量则限定了其浸染域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能利用它。
由于静态全局变量的浸染域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起缺点。

(2)从以上剖析可以看出, 把局部变量改变为静态变量后是改变了它的存储办法即改变了它的生存期。
把全局变量改变为静态变量后是改变了它的浸染域,限定了它的利用范围。

(3)static函数与普通函数浸染域不同,仅在本文件。
只在当前源文件中利用的函数该当解释为内部函数(static),内部函数该当在当前源文件中解释和定义。
对付可在当前源文件以外利用的函数,该当在一个头文件中解释,要利用这些函数的源文件要包含这个头文件。

如果能将类的方法定义成static,就只管即便定义成static,它的速率会提升将近4倍(实测是2倍多第一次用时1.2006530761719,第二次0.4865620136261,以下为测试代码)。

<?phpclass staticTest {public function test() {$i = 0; $i++;}public static function testStatic() {$i = 0;$i++;} }$start = microtime(true);for($i=0;$i<10000000;$i++) {$test = new staticTest();$test-&gt;test();}echo (microtime(true) - $start) .\"大众\n\"大众;$start = microtime(true);for($i=0;$i<10000000;$i++) {staticTest::testStatic();}echo microtime(true) - $start;

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继续范围内引用静态调用的类。
虽然也可以调用非静态方法,但是不会在运行时绑定。

static 不再只是大略的静态润色关键字。
而是可以像下面这样调用类的静态方法,非静态方法,为什么静态非静态要分开说呢,由于调用的效果是不一样的。

<?phpclass 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 ();?>

如上代码:B调用test方法,test方法调用who方法。
而B类中重写了who方法,则实际调用的是B中的who方法,以是输出的__CLASS__是B 这便是说 static 调用的静态方法会在运行时自动判断调用谁的方法。
而self则只会调用定义它时所在的类中的方法。
这是static的一个差异于其它调用的一个新特性。
而static调用非静态方法时则不会达到这种后期绑定的效果,以是叫后期静态绑定。

还有便是 static只能调用静态属性。

总结,static关键字可以实现以下功能:

1 调用类的静态方法 有后期静态绑定效果;

2 调用类的静态属性 有后期静态绑定效果;

3 调用类的非静态方法 没有后期静态绑定效果;