【问题标题】:How can I get the full namespace of a class without creating an instance of it?如何在不创建类实例的情况下获取类的完整命名空间?
【发布时间】:2014-09-08 00:49:35
【问题描述】:

我有这样的事情:

use Just\Some\Namespace\ClassName;

class A
{
    public static function doStuff()
    {
        echo function_name(ClassName);
    }
}

A::doStuff();

我想看到打印的是:Just\Some\Namespace\ClassName

整个想法是我想获得一个类的完整命名空间而不创建该类的对象。

我在网上搜索,最接近解决方案的是this question 中的答案。但是,它们都不是我需要的。

我可以像这样使用反射:

$reflectionClass = new ReflectionClass('Just\\Some\\Namespace\\ClassName');
echo $reflectionClass->getNamespaceName();

但我必须指定命名空间才能创建ReflectionClass。如果我已经知道它,我就不再需要它了。


为了得到Just\Some\Namespace\ClassName,我可以在我的代码中用什么替换function_name

【问题讨论】:

标签: php class namespaces


【解决方案1】:

从 PHP5.5 开始,您可以使用 class 关键字进行命名空间解析

从 PHP 5.5 开始,class 关键字也用于类名 解决。您可以获得包含完全限定名称的字符串 通过使用 ClassName::class 来定义 ClassName 类。这尤其 对命名空间类很有用

【讨论】:

    【解决方案2】:

    使用Magic constants__CLASS__

    类名。 (在 PHP 4.3.0 中添加)从 PHP 5 开始,此常量返回 声明的类名(区分大小写)。在 PHP 4 中它的价值 总是小写的。类名包括它所在的命名空间 在(例如 Foo\Bar)中声明。请注意,从 PHP 5.4 CLASS 开始有效 也在特质上。在 trait 方法中使用时,CLASS 是 使用 trait 的类

    喜欢

    echo __CLASS__; //   The class name. 
    

    【讨论】:

    • 对于那些坚持使用 PHP 5.5 以上版本的人来说,这是一个很好的折衷方案。谢谢。
    【解决方案3】:

    试试这个

    use Just\Some\Namespace\ClassName;
    
    class A
    {
        public static function doStuff()
        {
            echo function_name(ClassName::class);
        }
    }
    
    A::doStuff();
    

    【讨论】:

      【解决方案4】:

      获取给定对象/类的类“basename”(无命名空间)的最佳方式。

      function class_basename($class)
      {
          $class = is_object($class) ? get_class($class) : $class;
      
          return basename(str_replace('\\', '/', $class));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-18
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        • 2018-08-27
        • 1970-01-01
        • 2013-03-26
        • 1970-01-01
        相关资源
        最近更新 更多