php之静态属性与静态方法
静态属性用法:static public $var = 1;
从内存角度看,静态属性存放在类内,普通属性存放在对象中,类声明完毕,静态属性就存在,因为类在内存中只有一个,静态也只有一个。
普通属性存放在对象中,用对象->$var来访问,静态属性存放在类内,不依赖对象,没有对象也能访问,用类名::$var来访问,静态属性只有一个,为所有对象共享。
静态方法用法:static public function t(){}
普通方法存放在类内,只有一份,静态方法也存放在类内,也只有一份。区别在于,普通方法需要对象去调用,不需要绑定$this,即普通方法必须要有对象,用对象去调用,而静态方法不属于哪个对象,因此不需要绑定$this,即静态方法通过类名就可以调用。
比如
1 <?php 2 class Human1{ 3 public $name = '张三'; 4 static public function cry(){ 5 echo '5555'; 6 } 7 public function eat(){ 8 echo '吃饭'; 9 } 10 public function intro(){ 11 echo $this->name; 12 } 13 } 14 Human1::cry();//此时没有对象 15 16 Human1::eat();//在严格模式下,会报错Strict standards: Non-static method Human1::eat() should not be called statically非静态方法eat()不能被静态调用 17 18 //Human1::intro();//用类去调用非静态方法,会报错Fatal error: Using $this when not in object context没有在对象环境中调用$this 19 /**** 20 分析,其实非静态方法,是不能由类名静态调用的 21 但是,php中的面向对象检测并不严格 22 只要该方法没有$this,就会转化静态方法调用 23 而在php5.3的strict级别下,或者php5.4默认级别 24 都已经对类名::静态方法做了提示 25 ****/ 26 $lisi = new Human1(); 27 $lisi->cry();//对象访问静态方法,是可以的 28 /**** 29 类::静态方法,可以 30 类::动态方法,方法内没有$this情况下,可以,但严重不支持,逻辑上解释不通 31 对象->动态方法,可以 32 对象->静态方法,可以 33 ****/ 34 ?>
1 <?php 2 /**** 3 static 修饰的静态属性和静态方法 4 静态属性:储存在类空间,类声明完毕即存在,不依赖对象。(在内存中只有一份) 5 静态方法:静态方法,不绑定$this 6 ****/ 7 //下面是一个典型例子,static静态方法的特点,不绑定$this 8 class A{ 9 public function foo(){ 10 if (isset($this)) { 11 echo '$this is defined(',get_class($this),")<br />"; 12 var_dump($this); 13 }else { 14 echo "\$this is not defined.<br />"; 15 } 16 } 17 } 18 class B{ 19 public function bar(){ 20 A::foo(); 21 } 22 } 23 $a = new A(); 24 $a->foo();//$a是一个对象,调用普通方法foo(),自然$a绑定到$this 25 A::foo();//A是类名,但foo()是普通方法,这样写是不规范的,静态方法不绑定$this 26 27 28 $b = new B(); 29 $b->bar();//$b是一个对象,调用普通方法bar(),自然$b绑定到$this,bar(){A::foo();这里是静态调用,不操作$this} 30 B::bar();//$this is not defined 31 ?>