带有class keyword :: class的PHP作用域解析运算符

时间:2017-08-31 00:12:23

标签: php class static

到目前为止,我已经在PHP中使用了class关键字,只能用于创建PHP类。

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

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

例如:

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

3 个答案:

答案 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)

答案 2 :(得分:0)

是班级名称解析。它有助于获得完全限定的类名,特别是用于获取命名空间类。

在zend框架中,我们看到namespace用于琐碎的目的。使用类名解析有助于获取类名和名称空间。

例如:

namespace SOMENAME {
    class ClassName {
        //some implementation
    }

    echo ClassName::class;
}

意志输出:

SOMENAME\ClassName