【问题标题】:Fully qualified interface name完全限定的接口名称
【发布时间】:2015-11-27 10:39:21
【问题描述】:

有没有办法获得类似于MyClass::class 的完全限定接口名称?

例如:

namespace Example\Tests;

use Example\Interfaces\InputInterface;
...

class CommandTest ...
...
public function createInputMock()
{
    // I want to replace next string with something similar to MyClass::class
    $this->getMockBuilder('Example\Interfaces\InputInterface')
...

谢谢。

【问题讨论】:

  • InputInterface::class 不好吗?
  • 谢谢。我没有在与接口相关的 php 文档中找到它,所以我认为它只适用于类名。您可以发表您的评论作为答案,我会接受。

标签: php


【解决方案1】:

::class 名称解析可以与任何导入的命名空间一起使用:类、接口、函数...

namespace A\B\C {
    interface Interface_Bar {}
    function Function_Foo() {}
    function Function_Foo_Bar() {}
    const Const_BARFOO = 123;
}

namespace {
    use A\B\C\Interface_Bar;
    use A\B\C;
    use Undefined\Classes\UndefinedClass;
    use function A\B\C\Function_Foo_Bar;
    use const A\B\C\Const_BARFOO;

    echo Interface_Bar::class, "\n"; // print A\B\C\Interface_Bar
    echo C\Function_Foo::class, "\n"; // print A\B\C\Function_Foo
    echo C\Const_BARFOO::class, "\n"; // print A\B\C\Const_BARFOO
    echo UndefinedClass::class, "\n"; // print Undefined\Classes\UndefinedClass

    echo Function_Foo_Bar::class, "\n"; // print Function_Foo_Bar <- warning
    echo Const_BARFOO::class, "\n"; // print Const_BARFOO <- warning
}

【讨论】:

    【解决方案2】:

    如果我没听错的话,您不能使用 ::class 表示法迁移到 PHP 5.5,因此您希望在 5.4 或更早版本中使用类似的东西。

    所以简短的回答是——不,没有办法。

    在 PHP 的早期版本中缺少此功能是核心开发人员在 PHP 5.5 中添加 ::class 的原因。

    如果它是一个类名,你可以做一个奇怪的肮脏黑客:在新实例上使用get_class,但不要这样做。

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 2016-04-29
      • 2019-10-09
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多