带范围关键字的PHP作用域解析运算符:: class

问题描述:

我在PHP中关注的内容是class关键字只能用于创建PHP类。带范围关键字的PHP作用域解析运算符:: class

但是我已经看到,在一些框架如ZEND中,他们在其他地方使用它,如AlbumController::class

那么为什么它是这样使用的,这个概念的名称是什么?

为例:

return [ 
    'controllers' => [ 
     'factories' => [ 
      Controller\AlbumController::class => InvokableFactory::class, 
     ], 
    ], 

+0

不,先生我不是问范围解析运营商IM询问使用class关键字与该范围解析操作方式 –

+0

我的不好,更新以更好地反映这个问题。 – neuromatter

+0

你是我的英雄,非常感谢我搜索了很多,但无法找到结果,因为我不知道这个概念 –

我相信这个概念被称为类名称解析。您给出的示例用法看起来非常像依赖注入容器的定义。

使用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