2012-04-18 113 views
1

使用PHP 5.3+和有得等於下面我得到的「C」的輸出,而不是「B」:PHP:get_called_class()返回意外值

class A 
{ 
    public static function doSomething() 
    { 
     echo get_called_class(); 
    } 
} 

class B extends A 
{ 
    public static function doMore() 
    { 
     self::doSomething(); 
    } 
} 

class C extends B {} 

C::doMore(); 

如果我用靜態:: doSomething()將會是預期的結果,但是當使用self :: doSomething()時,我期望這個方法在B的範圍內被調用,因爲它是'self'被定義的地方,而不是後期的靜態綁定。

這是如何解釋,以及如何在doSomething()方法中獲得'B'?

由於提前,JS

回答

2

這裏的問題是late static bindingget_called_class()函數將使用後期靜態綁定來返回類名稱,如果使用static::調用,則將使用後期靜態綁定,但在與$this->或一起使用時不會使用。我不知道有什麼方法可以使其在B而不是A之內返回B。如果你使用PHP 5.4,這聽起來像是一個理想的特徵使用。

實施例:

class A 
{ 
    public static function doSomething() 
    { 
     echo __CLASS__; 
    } 
} 

class B extends A 
{ 
    public static function doMore() 
    { 
     self::doSomething(); 
    } 
} 

class C extends B {} 

C::doMore(); 

這返回A代替C

1

覆蓋的方法DoSomething的,得到B

class C extends B 
{ 
    public static function doMore() 
    { 
     B::doMore(); 
    } 
} 

Tested

+0

使用父代並不能解決問題,因爲get_called_class()仍然返回'C',但在這種情況下我需要'B'。即使使用B :: doSomething也會給我一個'C'作爲輸出。 – 2012-04-18 15:42:00

+0

J.S.我剛剛在PHP 5.4上測試過。它的返回'C' – Starx 2012-04-18 15:54:07

+0

感謝您的測試,這就是我的預期。但是我需要'B'在那個地方,我可以使用什麼來代替get_called_class來實現(除了回溯)? – 2012-04-18 16:08:04