静态延迟绑定
类可以自下往上调用父类方法,如果需要在父类中根据不同的子类,来调用子类的方法,那么就需要延迟静态绑定。所谓延迟静态绑定,就是不再被解析为定义当前方法所在的类,而是获取实际运行方法所在的类。
静态延迟绑定使用static关键字来实现,只适用于对静态属性和静态方法进行延迟绑定。示例代码如下。
1 class People
2 {
3 public static $name = 'People';
4 public static function showName()
5 {
6 echo self::$name; // 静态绑定
7 echo static::$name; // 静态延迟绑定
8 }
9 }
10 class Man extends People
11 {
12 public static $name = 'Man';
13 }
14 People::showName(); // People People
15 Man::showName(); // People Man
在上述代码中,Man类继承People类并重写静态属性$name,第6行使用self关键字实现静态绑定,第7行使用static关键字实现静态延迟绑定,当使用子类调用父类的静态方法时,static代表的是当前调用类,所以静态属性$name的输出结果是Man。
对于静态成员来说,若未被子类重写,则所有的子类包括父类都使用的是同一个静态成员。