2012-12-18 139 views
7

如何自動獲取類名稱空間?動態獲取PHP類名稱空間

神奇的變種__NAMESPACE__是不可靠的,因爲在子類中它沒有正確定義。

實施例:

class Foo\bar\A - >__NAMESPACE__ ===富\酒吧

class Ping\pong\B extends Foo\bar\A - >__NAMESPACE__ ===富\欄(應當平\乒乓)

PS:我注意到使用__CLASS__,但我使用get_called_class()解決了同樣的錯誤行爲...有沒有像get_called_class_namespace()?我怎樣才能實現這樣的功能?

UPDATE:
我認爲解決的辦法是我自己的問題,因爲我意識到get_called_class()回報完全合格的類名,因此我可以提取它的命名空間:d ...總之,如果有一個更有效做法讓我知道了;)

+0

您的解決方案是我必須在個人代碼中完成的。 http://codepad.viper-7.com/EgObtf –

+0

你所描述的並不是錯誤的行爲。看看這些常量是什麼:http://php.net/language.constants.predefined - 當你找到了解決問題的辦法時,你可以回答你自己的問題。 – hakre

+0

檢查這一個。我想這就是你的意思是: http://stackoverflow.com/questions/2317343/get-child-class-namespace-from-superclass-in-php/20193599#20193599 – Chris

回答

9

class Foo\Bar\A命名空間是Foo\Bar,所以__NAMESPACE__工作得非常好。你正在尋找的可能是命名空間類名,你可以通過加入echo __NAMESPACE__ . '\\' . __CLASS__;輕鬆獲得。

考慮下面的例子:

namespace Foo\Bar\FooBar; 

use Ping\Pong\HongKong; 

class A extends HongKong\B { 

    function __construct() { 
     echo __NAMESPACE__; 
    } 
} 

new A; 

會打印出Foo\Bar\FooBar這是非常正確的...

而且,即使你然後做

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     new A; 
    } 
} 

它會響應Foo\Bar\FooBar,這再次是非常正確的...

編輯:如果你需要得到內被嵌套它的主要的嵌套類的名稱空間,只需使用:

namespace Ping\Pong\HongKong; 

use Foo\Bar\FooBar; 

class B extends FooBar\A { 

    function __construct() { 
     $a = new A; 
     echo $a_ns = substr(get_class($a), 0, strrpos(get_class($a), '\\')); 
    } 
} 
+3

他們使用\ _ \ _ NAMESPACE \ _ \ _在父類中,但他們需要子類的名稱空間。 –

+0

阿哈,沒有從問題中得到它... – shadyyx

+0

@MaximilianRuta嗯,非常感謝您的修改,但請將來只修正需要修正的內容。 **你**的所有事件改爲**你**?這是我的寫作風格,並表現出一些禮貌,所以如果你不介意,讓我保持我表達自己的風格。謝謝!還要感謝審稿人批准這樣的**未成年人**,而不是那麼多**正確**編輯請求......幹得好! – shadyyx

9

在PHP 5.5,::類是可用的,這使得事情更容易10X。例如。 A::class

+0

示例http://php.net/manual/en/language.oop5.constants.php#example-179 – Jekis