gpt4 book ai didi

php - 如何获取内部带有命名空间的特征名称?

转载 作者:可可西里 更新时间:2023-10-31 22:40:00 25 4
gpt4 key购买 nike

我想知道是否有办法在自身内部获取 traits 命名空间,我知道我可以使用 self::class 获取类名,但在 trait 内部它获取命名空间使用该特征的类的名称,我不想像 new ReflectionClass('trait')

这样固定名称

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

最佳答案

我对你的问题有点困惑,但如果你需要特征的完全限定名称,那么你可以使用 __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
}
}

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

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();

预定义的 magic constants __TRAIT__(自 5.4.0 起)和 __NAMESPACE__(自 5.3.0 起)被使用,因此请使用需要的一个。在 php v-5.4.0 中测试。查看演示 here .

另外,如果你想从使用它的类中获取特征的完全限定名称,那么你可以使用 NameOfTheTrait::class (NameOfTheClass::class/NameOfTheInterface::class) 但这在 php v-5.5 之后可用。

在使用 self::class 时也要小心。 self::class 将给出您使用它的类的完全限定名称,因为 self 自从self 的范围是在编译时确定的,因此如果您继承一个使用了 self::class 语句的类,您可能会得到意想不到的结果。换句话说,如果您从子类调用任何静态方法,那么如果您在父类中使用 self 调用上下文仍将是父类,在这种情况下您需要使用 static 而不是 self。这实际上是另一个话题,所以请阅读更多关于 Late Static Binding 的 php 手册。 .

关于php - 如何获取内部带有命名空间的特征名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48691388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com