【问题标题】:PHP: How to get a fully qualified class name from an alias?PHP:如何从别名中获取完全限定的类名?
【发布时间】:2013-11-21 02:43:26
【问题描述】:

在 PHP 中,如果我想获取包含在 use 语句中的类的完全限定类名,我该怎么做?例如,

<?php
namespace MyNamespace;

use Namespace\To\Class as MyClass;

function getNamespaceOfMyClass() {
    // Return ??
}

echo getNamespaceOfMyClass();

我知道一种方法是创建get_class(new MyClass()),但如果我不能/不想创建MyClass 的实例怎么办?谢谢!

【问题讨论】:

  • 你为什么要这样做?
  • @AlexP:这样做有完全正当的理由。其中之一是当您想要指示 DI 容器如何解析特定类型时。
  • @Jon 我没有说它无效。我想知道更多信息,因为这是一个人为的例子。
  • @AlexP 我的具体用例是在 Zend Framework 2 中,我们有一个 EventManager,它的事件附加到类的完全限定类名。我正在重构的代码看起来不太好——例如,它使用以下内容:use Account\Document\Profile;,然后:get_class(new Profile()); 来完成这项工作,这并不理想。我想要一种普通的方式来做到这一点,最好不需要 PHP 5.5。
  • @OmarDiab 我看到了两难境地,我在尝试从 ObjectManager()-&gt;getEntityRepository($className) 调用实体时遇到同样的问题,我不想对类进行硬编码。我倾向于使用在实体服务层中定义的一些静态变量(例如static::ENTITY_CLASS_NAME_PROFILE = 'Namespace/entity/Profile';

标签: php class namespaces alias


【解决方案1】:

在 PHP 5.5 及更高版本中,您可以使用 ::class

echo MyClass::class;

不幸的是,这在早期版本中根本不可能,您必须对类名进行硬编码或先创建一个实例并在其上使用 get_class

【讨论】:

  • 太棒了,不知道!可惜早期版本没有办法,我再坚持一下,看看有没有人有什么技巧。
  • 如果我的类名是变量(字符串)怎么办?即($prefix . 'Class')::class 不起作用!感谢您的帮助。
  • @Roubi 如果你在字符串中有类名,那么它必须是完全限定的,否则你不能用它做任何有用的事情。用例是什么?
  • 它用于使用 Symfony3 动态创建表单,但您让我意识到正确的方法可能是“手动”在字符串中添加命名空间。我只是想知道是否有办法偷懒,但这毫无意义。感谢您的宝贵时间。
  • @myol ::class 在第一行是那个链接,还是你在寻找别的东西?
【解决方案2】:

在早期的 PHP 版本(即 PHP Reflection API 获取类名,如下所示:

namespace App\Core;

use Symfony\Component\Form\Extension\Core\Type;

class MyClass {}

$refclass = new \ReflectionClass(new Type\DateType);
print $refclass->getName();
$refclass = new \ReflectionClass(new MyClass());
print $refclass->getName();

当然,如果这对你的情况来说不贵的话。

注意
自 PHP 5.4 起:

$classname = (new \ReflectionClass(new Type\DateType))->getName();

【讨论】:

    猜你喜欢
    • 2021-11-30
    • 2021-03-25
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 2020-11-12
    • 2011-01-02
    相关资源
    最近更新 更多