我想知道是否有一种方式来获得内部本身的特点命名空间,我知道我可以使用self::class
得到类名,而是一个特质里面获取使用的类的命名空间特征,我不想输入它的名称固定为new ReflectionClass('trait')
是否有任何函数或const可以做到这一点?
答案 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.0
(NameOfTheTrait::class
/ NameOfTheClass::class
)但这是可用的自NameOfTheInterface::class
。
使用php v-5.5
时也要小心。 self::class
将提供您使用它的类的完全限定名称,因为self::class
始终引用词法范围(物理上使用它),因为self
的范围已确定在编译期间,如果继承使用self
语句的类,则可能会出现意外结果。换句话说,如果从子类调用任何静态方法,那么如果在父类中使用self::class
,则调用上下文仍将是父类,在这种情况下,您需要使用self
代替static
。这实际上是另一个主题所以请在php手册上阅读更多关于Late Static Binding的内容。