PHP范围解析操作符与class关键字::class

10 浏览
0 Comments

PHP范围解析操作符与class关键字::class

到目前为止我在PHP中学到的是,class关键字是保留的,只能用于创建PHP类。

然而我注意到在一些框架中,比如ZEND,它们在其他地方使用它,比如AlbumController::class

那么为什么要这样使用,这个概念叫什么呢?

例如:

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

0
0 Comments

PHP的作用域解析运算符(::)与class关键字一起使用(::class)的目的是获取类的完全限定名称。这个功能在PHP 5.5中引入,它提供了一种更简洁和安全的方式来获取类名。

使用::class可以避免在代码中硬编码类名,这样可以提高代码的可维护性。当类名发生变化时,只需更新类的定义,而无需在整个代码库中搜索和替换类名。

作用域解析运算符(::)通常用于访问静态属性和静态方法,但与class关键字一起使用时,它的功能是返回类的完全限定名称。

以下是一个使用::class获取类名的示例:

class MyClass {
  // Class definition
}
$className = MyClass::class;
echo $className; // 输出 "MyClass"

解决方法:使用::class运算符时,需要确保在调用的类已经定义。如果尝试获取未定义类的完全限定名称,将会抛出一个致命错误。

更多关于PHP作用域解析运算符与class关键字的使用方法,请参考上述提供的链接。

0
0 Comments

PHP中的作用域解析运算符(scope resolution operator)和class关键字::class一起使用可以帮助获取完全限定的类名,特别适用于获取命名空间类。

在Zend Framework中,我们经常使用namespace来进行一些琐碎的操作。使用作用域解析运算符和class关键字可以获取带有命名空间的类名。

例如:

namespace SOMENAME {
    class ClassName {
        //some implementation
    }
    echo ClassName::class;
}

将输出:

SOMENAME\ClassName

这个特性的出现是为了方便在代码中获取带有命名空间的类名,避免手动拼接字符串。通过使用class关键字和作用域解析运算符,我们可以直接获取类的限定名称。

解决方法就是使用作用域解析运算符和class关键字来获取带有命名空间的类名。在代码中,只需要使用ClassName::class即可获取完整的类名,包括命名空间。

这个特性的出现简化了代码编写的过程,提高了代码的可读性和可维护性。通过直接获取类名,我们可以更方便地进行类的引用和使用。

0
0 Comments

PHP的范围解析运算符(::)与类关键字(class)一起使用的概念被称为类名解析。你给出的示例用法非常类似于依赖注入容器的定义。

使用依赖注入容器时,您可以将定义以数组格式列出,就像您给出的代码一样,当您需要已定义的类时,所有的注入将自动解析。

例如,假设您有一个带有以下定义的依赖注入容器:

$containerDefinitions = [
    Database\DatabaseAccessorInterface::class => Database\ConcreteDatabaseAccessor::class,
    Data\QueryExecutionHandlerInterface::class => Data\ConcreteQueryExeuctionHandler::class
];

然后,您定义了类`ConcreteQueryExeuctionHandler`的构造函数如下:

public function __construct(DatabaseAccessorInterface $databaseAccessor)
{
    $this->databaseAccessor = $databaseAccessor;
}

当您从依赖注入容器中检索`QueryExecutionHandlerInterface`的定义时,可以像这样进行:

$queryExecutionHandler = $container->get(Data\QueryExecutionHandlerInterface::class);

在构造`ConcreteQueryExecutionHandler`时,它将自动注入`ConcreteDatabaseAccessor`。

这只是一个非常具体的示例,但我相信您提供的代码是一个依赖注入容器定义数组。

0