2017-08-31 3 views
0

Ce que j'ai pu m'appliquer dans PHP jusqu'à présent, c'est que le mot clé class est réservé et ne peut être utilisé que pour créer une classe PHP.Opérateur de résolution d'étendue PHP avec class keyword :: class

Cependant, j'ai vu que dans certains cadres tels que ZEND, ils l'utilisent dans d'autres endroits comme AlbumController::class.

alors pourquoi est-il utilisé comme tel et quel est le nom de ce concept?

comme exemple:

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

Répondre

0
+0

non monsieur je ne suis pas poser des questions sur l'opérateur de résolution de portée im poser des questions sur l'utilisation du mot-clé class avec l'opérateur de résolution de portée dans ce façon –

+0

Mon mauvais, mis à jour pour mieux refléter la question. – neuromatter

+0

vous êtes mon héros merci beaucoup par la façon dont j'ai beaucoup cherché, mais n'a pas été en mesure de trouver un résultat parce que je ne savais pas le concept –

1

Je crois que ce concept est appelé résolution de nom de classe. L'exemple d'utilisation que vous avez donné ressemble beaucoup à une définition pour un conteneur d'injection de dépendance. Avec un conteneur DI, vous liez vos définitions dans un format de tableau, comme le code que vous avez donné, puis lorsque vous avez besoin de la classe définie, toutes vos injections sont automatiquement résolues.

Par exemple, supposons que vous avez un conteneur de DI avec les définitions suivantes:

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

... et vous avez le constructeur de la classe ConcreteQueryExeuctionHandler définie comme ceci:

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

... Eh bien, lorsque vous récupérez la définition QueryExecutionHandlerInterface du conteneur DI, avec quelque chose comme ceci:

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

... puis il va auto-injecter le ConcreteDatabaseAccessor lors de la construction de ConcreteQueryExecutionHandler.

Ceci est un exemple très spécifique, mais je crois que le code que vous avez fourni est un tableau de définition de conteneur DI.

0

Il s'agit d'une résolution de nom de classe. Il aide à obtenir le nom de classe pleinement qualifié, particulièrement utilisé pour obtenir la classe namespaced.

Dans le cadre zend, nous voyons namespace utilisé à des fins triviales. L'utilisation de la résolution de nom de classe aide à obtenir le nom de classe avec l'espace de nom.

Par exemple:

namespace SOMENAME { 
    class ClassName { 
     //some implementation 
    } 

    echo ClassName::class; 
} 

La sortie de volonté:

SOMENAME\ClassName