从PHP5.3开始,PHP增加了后期静态绑定(LSB,Late Static Bindings)的功能,“后期绑定”即指不再在编译时解析为定义方法所在的类,而是在实际运行时根据实际调用上下文来确定。这也是static和self关键词的区别所在。
self的局限性
self只能对定义方法所在的类进行调用,如
<?php
<?php
class Animals
{
const NAME = 'Animals';
public static function getName(): void
{
echo self::NAME;
}
}
class Birds extends Animals
{
const NAME = 'Birds';
}
class Chicken extends Birds
{
const NAME = 'Chicken';
}
Chicken::getName(); //Animals
Birds::getName(); //Animals
self只对定义该方法的类内起作用,所以子类调用getType()获取到的也是Animals类的属性。
static和后期静态绑定
如果我们希望在不复写方法的情况下实时获取子类的属性,self显然无法达到我们预期的效果,此时static便提供解析问题的方案。
static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为“静态绑定”,因为它可以用于(但不限于)静态方法的调用。[1]
同样的结构:
<?php
class Animals
{
const NAME = 'Animals';
public static function getName(): void
{
echo static::NAME;
}
}
class Birds extends Animals
{
const NAME = 'Birds';
}
class Chicken extends Birds
{
const NAME = 'Chicken';
}
Chicken::getName(); //Chicken
Birds::getName(); //Birds
当我们把self换成static后,此时取得便是完全解析了的静态调用,可以在不改变调用方法的情况下实时获取到子类的静态属性。