如何获得内部具有名称空间的特征名称?

Mat*_*ldi 4 php namespaces traits

我想知道是否有一种在自身内部获取traits名称空间的方法,我知道可以self::class用来获取类名,但是在trait内部它可以获取使用trait的类的名称空间,我不想输入它的名称固定像new ReflectionClass('trait')

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

The*_*pha 6

我对您的问题有些困惑,但是如果您需要特征中的全限定名称,则可以使用__TRAIT__魔术常数,如果您只需要特征的名称空间,则可以使用__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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

使用预定义的魔术常数 __TRAIT__(自5.4.0起)和__NAMESPACE__(自5.3.0起),因此请使用所需的常数。在中测试php v-5.4.0。在此处查看演示。

另外,如果要从使用特性的类中获取特性的完全限定名称,则可以使用NameOfTheTrait::classNameOfTheClass::class/ NameOfTheInterface::class),但是自以来就可用php v-5.5

使用时也要小心self::class。该self::class将给你使用过它的类的全名,因为self总是引用词汇范围(在那里的实际使用),因为范围self在编译时确定的,所以如果你继承一个类,你可能会得到意想不到的结果使用self::class语句的地方。换句话说,如果您从子类中调用任何静态方法,那么如果您self在父类中使用,则调用上下文仍将是父类,在这种情况下,您需要使用static而不是self。这实际上是另一个主题,因此请在php手册上阅读有关Late Static Binding的更多信息