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 ?>

 

你可能感兴趣的:(静态方法)