如何在命名空间内获取特征名称?

时间:2018-02-08 17:27:32

标签: php namespaces traits

我想知道是否有一种方式来获得内部本身的特点命名空间,我知道我可以使用self::class得到类名,而是一个特质里面获取使用的类的命名空间特征,我不想输入它的名称固定为new ReflectionClass('trait')

是否有任何函数或const可以做到这一点?

1 个答案:

答案 0 :(得分:5)

我对你的问题有点困惑,但如果你需要特质的完全限定名,那么你可以使用__TRAIT__魔法常数,如果你只需要特征的命名空间,那么你可以使用{ {1}}。例如,使用命名空间声明特征:

__NAMESPACE__

现在,使用另一个命名空间声明一个类,并在该类中使用该特征:

namespace App\Http\Controllers\Traits;

trait Methods
{
    public function getNamespace()
    {
        // Get fully qualified name of the trait
        echo __TRAIT__; // App\Http\Controllers\Traits\Methods

        echo PHP_EOL;

        // Get namespace of the trait
        echo __NAMESPACE__; // App\Http\Controllers\Traits
    }
}

使用预定义的magic constants namespace App\Http\Controllers; use App\Http\Controllers\Traits\Methods; class TraitController { use Methods; public function index() { // Call the method declared in trait $this->getNamespace(); } } (new TraitController)->index(); (自5.4.0开始)和__TRAIT__(自5.3.0开始),因此需要使用哪一个。在__NAMESPACE__中测试过。查看演示here

此外,如果您想从使用它的类中获取特征的完全限定名称,那么您可以使用php v-5.4.0NameOfTheTrait::class / NameOfTheClass::class)但这是可用的自NameOfTheInterface::class

使用php v-5.5时也要小心。 self::class将提供您使用它的类的完全限定名称,因为self::class始终引用词法范围(物理上使用它),因为self的范围已确定在编译期间,如果继承使用self语句的类,则可能会出现意外结果。换句话说,如果从子类调用任何静态方法,那么如果在父类中使用self::class,则调用上下文仍将是父类,在这种情况下,您需要使用self代替static。这实际上是另一个主题所以请在php手册上阅读更多关于Late Static Binding的内容。