后期静态绑定中的转发和非转发调用(PHP 5.3)

Poo*_*att 4 php-5.3

<?php
class A {
    public static function foo() {
        static::who();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}

class B extends A {
    public static function test() {
        A::foo();
        parent::foo();
        self::foo();
    }

    public static function who() {
        echo __CLASS__."\n";
    }
}
class C extends B {
    public static function who() {
        echo __CLASS__."\n";
    }
}

C::test();
?> 
Run Code Online (Sandbox Code Playgroud)

下面给出的是输出:

A
C
C
Run Code Online (Sandbox Code Playgroud)

任何人都可以评估告诉该输出是如何产生的?

Chr*_*hey 8

test()"A"中第一行的结果不利用Late Static Binding,因为在所有情况下,你直接调用类"A"的foo实现(技术上它是LSB,但是静态绑定到A).第二行和第三行用static关键字证明了预期的行为,继承链无所谓,static指的是被调用的类.因此,即使您从B调用parent :: foo(),该实现也使用LSB,其中static关键字解析为被调用的类,即C语言.对于self :: foo()也是如此.