Mat*_*ldi 4 php namespaces traits
我想知道是否有一种在自身内部获取traits名称空间的方法,我知道可以self::class用来获取类名,但是在trait内部它可以获取使用trait的类的名称空间,我不想输入它的名称固定像new ReflectionClass('trait')
是否有任何函数或const可以做到这一点?
我对您的问题有些困惑,但是如果您需要特征中的全限定名称,则可以使用__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::class(NameOfTheClass::class/ NameOfTheInterface::class),但是自以来就可用php v-5.5。
使用时也要小心self::class。该self::class将给你使用过它的类的全名,因为self总是引用词汇范围(在那里的实际使用),因为范围self在编译时确定的,所以如果你继承一个类,你可能会得到意想不到的结果使用self::class语句的地方。换句话说,如果您从子类中调用任何静态方法,那么如果您self在父类中使用,则调用上下文仍将是父类,在这种情况下,您需要使用static而不是self。这实际上是另一个主题,因此请在php手册上阅读有关Late Static Binding的更多信息。