2012-06-17 38 views
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(); 
?> 

下面給出的是輸出:轉發和非轉發調用(PHP 5.3)

A 
C 
C 

任何人都可以評估告訴怎麼說的輸出已經生產出來的?

回答

7

test()「A」中第一行的結果沒有利用Late Static Binding,因爲在任何情況下都是直接調用類「A」的foo實現(技術上它是LSB,但靜態綁定到A)。第二行和第三行用static關鍵字演示期望的行爲,繼承鏈無關緊要,static指被調用的類。因此,即使你從B調用了parent :: foo(),該實現也使用了LSB,其中靜態關鍵字解析爲被調用類,這是C.與self :: foo()相同。

+0

謝謝幫助 –