PHP继承----静态延迟绑定

思考:self关键字适用于类内部代替类的,代替的是当前所在的类本身,随着继承的实现,如果子类子访问父类的方法的时候,self到底代替的是谁呢?

引入:self是一种静态绑定,换言之即使当类进行编译的时候seld已经明确绑定了类名,因此不论多少继承,也不管是子类还是父类自己来进行访问

self代表的都是当前类,如果想要选择性的来支持来访者,就需要使用静态延迟绑定。

静态延迟绑定【掌握】

定义:静态延迟绑定,即在类内部用来代表类本身的关键字部分不是在类编译时固定好,而是当方法被访问时动态的选择来访者所属的类,静态

延迟绑定就是利用static 关键字代替静态绑定self,静态延迟绑定需要使用到静态成员的重写。(跟$this比较像 )

1.静态延迟绑定:使用static关键字代替self进行类成员访问

<?php

class posen{
   // 静态属性
   public static $name='posen';

   // 静态方法
   public static function show(){
      echo self::$name.'self::<br>';          //静态绑定
      echo static::$name.'static::<br>';       //静态延迟绑定
   }

}

posen::show();      //两个都能输出 posen 说明两个调用都可以
?>

2.静态延迟绑定一定是通过继承后的子类来进行访问才有效果

<?php

class posen{
   // 静态属性
   public static $name='posen';

   // 静态方法
   public static function show(){
      echo self::$name.'self::<br>';          //静态绑定
      echo static::$name.'static::<br>';       //静态延迟绑定
   }

}
// 子类继承
class man extends posen{
   // 重写父类中的静态属性name
   public static $name="man";   //有了这个属性,就显示man:static  了

}

man::show();   //还是显示的posen 为什么呢?不是说使用static 延迟绑定就能指向调用的类吗?
               // 因为你man类中没有自己的静态的属性,所以它就向上一层去找 找到了posen
?>

注意:self关键字 --在你调用这个类加载到内存编译的时候self就绑定了当前的类,而static 在编译的时候则不会绑定,而是调用的时候在绑定调用的类

总结:

  1.静态延迟绑定是指通过static关键字进行类静态成员的访问,是指在被访问时才决定到底使用那个类

  2.静态延迟绑定对比的是静态绑定self

  3.静态延迟绑定的意义是用来保证访问的静态成员是根据调用类的不同而选择不同的表现