2012-12-18 143 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