后期静态绑定
在 PHP 5.3 及更高版本中,你可以利用后期静态绑定来控制调用静态属性或方法的类。添加它是为了克服 self::
范围解析器固有的问题。请使用以下代码
class Horse {
public static function whatToSay() {
echo 'Neigh!';
}
public static function speak() {
self::whatToSay();
}
}
class MrEd extends Horse {
public static function whatToSay() {
echo 'Hello Wilbur!';
}
}
你会期望 MrEd
类会覆盖父 whatToSay()
函数。但是当我们运行这个时,我们会得到一些意外
Horse::speak(); // Neigh!
MrEd::speak(); // Neigh!
问题是 self::whatToSay();
只能引用 Horse
类,这意味着它不服从 MrEd
。如果我们切换到 static::
范围的 resolutor,我们没有这个问题。这个更新的方法告诉类遵循调用它的实例。因此,我们得到了我们期待的继承
class Horse {
public static function whatToSay() {
echo 'Neigh!';
}
public static function speak() {
static::whatToSay(); // Late Static Binding
}
}
Horse::speak(); // Neigh!
MrEd::speak(); // Hello Wilbur!