我不知道这种后期静态绑定是如何工作的。
abstract class A{
final public static function doprint(){
print get_called_class() . '<br>';
}
public static function wrapper(){
self::doprint();
static::doprint();
}
}
class A2 extends A{}
A2::wrapper();
get_called_class()在两种情况下都打印A2,即使我用self调用doprint方法也是如此。为什么呢?
答案 0 :(得分:1)
我认为get_called_class()
告诉你调用了哪个类,并且它的输出是正确的。
后期静态绑定允许self
上下文冒泡,因此定义得更高的方法可以对被调用方法的对象进行操作。
答案 1 :(得分:1)
get_called_class()始终返回您实际调用的类。你打电话给 A2 :: 所以它是A2。
在我的网站上有一个带有 LSB单例抽象类的教程。我没有链接到这里,因为总是有一个僵尸警戒来到并删除链接甚至没有看。 但它在我的描述中。
LSB的捕获是A中的方法可以调用B中的方法,该方法可以调用A中的方法。 请参阅此示例:
header('Content-Type: text/plain'); // Pretty text output
// LSB Parent
class A {
// NOLSB: Will call Current Class method
static public function TriggerSelf() {
self::OverrideMe();
}
// LSB: Will call Inheriting Class method (or Current if none Inherits)
static public function TriggerStatic() {
static::OverrideMe();
}
// Method to Override
static public function OverrideMe() {
echo 'A here', PHP_EOL;
}
}
// LSB Child
class B extends A {
// Override by LSB
static public function OverrideMe() {
echo 'B here', PHP_EOL;
}
}
A::TriggerSelf(); // <- NO LSB
A::TriggerStatic(); // <- LSB (but not inheritance)
B::TriggerSelf(); // <- NO LSB
B::TriggerStatic(); // <- LSB (with inheritance, so it works)
了解 B :: TriggerStatic()如何允许A调用B方法,而 B :: TriggerSelf()调用A方法。 那是LSB。父类静态方法可以调用子类静态方法。这是非常静态的摘要:)
研究这个例子,它会有意义。