带范围关键字的PHP作用域解析运算符:: class
问题描述:
我在PHP中关注的内容是class
关键字只能用于创建PHP类。带范围关键字的PHP作用域解析运算符:: class
但是我已经看到,在一些框架如ZEND中,他们在其他地方使用它,如AlbumController::class
。
那么为什么它是这样使用的,这个概念的名称是什么?
为例:
return [
'controllers' => [
'factories' => [
Controller\AlbumController::class => InvokableFactory::class,
],
],
答
我相信这个概念被称为类名称解析。您给出的示例用法看起来非常像依赖注入容器的定义。
使用DI容器,您可以以阵列格式列出您的定义,就像您提供的代码一样,然后当您需要定义的类时,所有注射都会自动解析。
例如,假设你有以下定义一个DI容器:
$containerDefinitions = [
Database\DatabaseAccessorInterface::class => Database\ConcreteDatabaseAccessor::class,
Data\QueryExecutionHandlerInterface::class => Data\ConcreteQueryExeuctionHandler::class
];
...然后你有一个像这样定义的类ConcreteQueryExeuctionHandler
构造:
public function __construct(DatabaseAccessorInterface $databaseAccessor)
{
$this->databaseAccessor = $databaseAccessor;
}
...好吧,当您从DI容器中检索定义QueryExecutionHandlerInterface
时,使用类似下面的内容:
$queryExecutionHandler = $container->get(Data\QueryExecutionHandlerInterface::class);
...然后它会在ConcreteQueryExecutionHandler
的施工期间自动注入ConcreteDatabaseAccessor
。
这是一个非常具体的例子,但我相信你提供的代码是一个DI容器定义数组。
答
这是类名解析。它有助于获取完全限定的类名,特别是用于获取名称空间的类。
在zend框架中,我们看到namespace
用于平凡的目的。使用类名解析有助于获取类名和名称空间。
例如:
namespace SOMENAME {
class ClassName {
//some implementation
}
echo ClassName::class;
}
意志输出:
SOMENAME\ClassName
不,先生我不是问范围解析运营商IM询问使用class关键字与该范围解析操作方式 –
我的不好,更新以更好地反映这个问题。 – neuromatter
你是我的英雄,非常感谢我搜索了很多,但无法找到结果,因为我不知道这个概念 –