到目前为止,我已经在PHP中使用了class
关键字,只能用于创建PHP类。
但是我已经看到在某些框架中,例如ZEND,他们会在其他地方使用它,例如AlbumController::class
。
那么为什么它被这样使用,这个概念的名称是什么?
例如:
return [
'controllers' => [
'factories' => [
Controller\AlbumController::class => InvokableFactory::class,
],
],
答案 0 :(得分:1)
我相信这个概念叫做类名解析。您给出的示例用法看起来非常像依赖注入容器的定义。
使用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);
...然后它会在构建ConcreteDatabaseAccessor
期间自动注入ConcreteQueryExecutionHandler
。
这是一个非常具体的示例,但我相信您提供的代码是DI容器定义数组。
答案 1 :(得分:0)
好的解释:https://stackoverflow.com/a/42064777/8518859
PHP文档:http://php.net/manual/en/migration55.new-features.php#migration55.new-features.class-name
答案 2 :(得分:0)
是班级名称解析。它有助于获得完全限定的类名,特别是用于获取命名空间类。
在zend框架中,我们看到namespace
用于琐碎的目的。使用类名解析有助于获取类名和名称空间。
例如:
namespace SOMENAME {
class ClassName {
//some implementation
}
echo ClassName::class;
}
意志输出:
SOMENAME\ClassName