从 PHP 中的超类获取子类命名空间

2022-08-30 14:54:29

假设我在不同的文件中有以下类:

<?php
    namespace MyNS;

    class superclass {

        public function getNamespace(){
            return __NAMESPACE__;
        }
    }
?>

<?php
    namespace MyNS\SubNS;

    class childclass extends superclass { }
?>

如果我实例化“childclass”并调用getNamespace(),它将返回“MyNS”。

有没有办法从子类获取当前命名空间而不重新声明该方法?

我已经诉诸于在每个类中创建一个静态$namespace变量,并使用它来引用它,但感觉不是很优雅。super::$namespace


答案 1

__NAMESPACE__是一个编译时常量,这意味着它仅在编译时有用。您可以将其视为一个宏,其中插入的内容将用当前命名空间替换自身。因此,没有办法进入超类来引用子类的命名空间。你将不得不求助于某种变量,这种变量在每个子类中都被分配,就像你已经在做的那样。__NAMESPACE__

作为替代方法,您可以使用反射来获取类的命名空间名称:

$reflector = new ReflectionClass('A\\Foo'); // class Foo of namespace A
var_dump($reflector->getNamespaceName());

请参阅 PHP 手册以获取更多(未完成的)文档。请注意,您需要使用 PHP 5.3.0 或更高版本才能使用反射。


答案 2

您也可以在 getNamespace() 方法中执行此操作:

return get_class($this);

从子类调用时,结果将为:

MyNS\SubNS\childclass

如果您不希望类名在末尾,只需砍掉从最后一个\到结尾的所有内容即可。


推荐