2012-09-13 7 views
12

Je commence tout juste à regarder Zend Framework 2 (et je suis nouveau sur ZF en général), et dans le user guide, ils utilisent l'auto-chargement lors de l'ajout d'un nouveau module. Cependant, je trouve l'explication assez difficile pour une recrue. Ils ajoutent un fichier Module.php dans le répertoire du module, qui contient entre autres le code suivant:Zend Framework 2 chargement automatique

public function getAutoloaderConfig() 
    { 
     return array(
      'Zend\Loader\ClassMapAutoloader' => array(
       __DIR__ . '/autoload_classmap.php', 
      ), 
      'Zend\Loader\StandardAutoloader' => array(
       'namespaces' => array(
        __NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__, 
       ), 
      ), 
     ); 
    } 

Maintenant, je fait quelques recherches autour d'essayer de comprendre ce que ce autoloading est tout au sujet. Pour autant que je sache, l'autoloading utilise spl_autoload_register() et est un moyen d'éviter d'avoir require_once() partout dans le code. Ainsi, en essayant d'utiliser une classe qui n'est pas définie, la méthode autoload() qui a été enregistrée sera exécutée, ce qui fait simplement une recherche de tableau et inclut le fichier comme ci-dessous s'il a été ajouté.

// Zend/Loader/ClassMapAutoloader.php 
public function autoload($class) 
{ 
    if (isset($this->map[$class])) { 
     require_once $this->map[$class]; 
    } 
} 

Cela semble intelligent en raison de la performance. J'espère que ce que je viens d'écrire est correct. Basé sur ceci, j'essaye de comprendre ce qui se passe dans getAutoloaderConfig() du premier extrait de code, mais je suis assez confus. Il semble que le tableau qui est retourné par cette méthode est utilisé pour AutoloaderFactory::factory(), mais je ne suis pas sûr dans quel but. Instantiating autochargeurs avec des options, il semble, mais exactement ce que cela fait, je ne suis pas sûr. Je suppose que la deuxième entrée du tableau spécifie où trouver les fichiers source pour l'espace de noms du module - au moins, ce serait ma conjecture. La première entrée que je suis, cependant, pas sûr de. Dans le guide de l'utilisateur, il est dit ce qui suit:

Comme nous sommes dans le développement, on n'a pas besoin de charger les fi via le classmap, donc nous fournir un tableau vide pour le chargeur automatique classmap.

Le fichier renvoie simplement un tableau vide. Je ne suis pas sûr de l'objectif de ce ClassMapAutoloader. Désolé, si mon point n'est pas clair; Fondamentalement, j'essaie de comprendre ce qui se passe dans getAutoloaderConfig() et à quoi sert mymodule/autoload_classmap.php. Si quelqu'un pouvait faire la lumière sur ce sujet, ce serait très apprécié!

+8

Zend est tellement sur son ingénierie ridicule. – wesside

+1

Absolument. Mais je pense que si vous trouvez votre chemin, c'est vraiment très puissant. Comme Magento. –

+0

Je l'utilise au travail, il a ses hauts et ses bas. Je préfère Kohana, et j'utilise les bibliothèques Zend dont j'ai besoin. Désolé @ andy124, n'en ai pas encore utilisé 2, désolé de pirater votre question. – wesside

Répondre

21

La classe est là pour montrer à PHP le chemin le plus direct vers une classe. Il est essentiellement dire « Vous vous cherchez A\Class\Youre\Looking\For, ne cherchez pas plus loin que ce fichier. xyz.php Ce serait exprimé comme ceci:

return array(
    'A\Class\Youre\Looking\For' => ___DIR__.'/xyz.php' 
) 

Sans elle PHP doit courir à travers toute la chaîne de chargeur automatique, qui peut être Pourquoi est-ce que cela dit quelque chose à propos de "comme nous sommes en développement"? Parce que les fichiers classmap sont généralement générés sur le serveur de production par un script quelconque, mais ne vous inquiétez pas trop pour le moment. ...

La méthode getAutoloaderConfig() est juste là pour vous donner une certaine flexibilité dans des applications vraiment avancées.La plupart du temps, vous pouvez simplement utiliser le Skeleto nApplication's et le code standard de SkeletonModule et laissez-le tranquille. Vraiment, vous pouvez même tuer la partie 'Zend\Loader\ClassMapAutoloader' => array(__DIR__ . '/autoload_classmap.php',) pour le moment.

C'est juste un point d'ancrage pour de futures améliorations et ne vous inquiétez pas trop si vous débutez avec ZF2 (comme moi).

+0

Merci. Ce que vous avez écrit à propos de ClassMapAutoloader est logique dans votre exemple, mais je ne suis pas certain que la clé du tableau soit 'Zend \ Loader \ ClassMapAutoloader'. La valeur fait référence à un fichier PHP qui n'est même pas une classe; ça retourne juste un tableau.Ma conjecture serait qu'elle dit à 'ClassMapAutoloader' de regarder dans ce fichier pour la configuration de la carte de classe. Pas que je vais l'utiliser maintenant, mais le but de 'autoload_classmap.php' est-il alors de renvoyer juste un tableau de noms de classes comme clé et chemin comme valeur? Comme je comprends de votre réponse, ce n'est pas nécessaire, mais juste une optimisation. – Andy0708

+1

Zend \ Loader \ ClassMapAutoloader est une classe. Voir https://github.com/zendframework/zf2/blob/master/library/Zend/Loader/ClassMapAutoloader.php Donc, il est dit "utiliser le ClassMapAutoloader et lui donner comme paramètre le fichier autoload_classmap.php". L'autochargeur utilise ensuite le tableau renvoyé à partir de ce fichier pour mapper des classes à des fichiers spécifiques. Est-ce que c'est un peu plus clair? –

8

ZF2 dispose d'un certain nombre d'autochargeurs disponibles.

Les 2 plus communs (ou les 2 avec lesquels les développeurs interagissent directement à tout moment) sont Zend\Loader\ClassMapAutoloader et Zend\Loader\StandardAutoloader.

  1. Le chargeur automatique classmap est habituellement utilisé au niveau du module pour fournir un tableau simple mais rapide mécanisme de recherche. Il est configuré avec un tableau associatif de key => value paires, avec la clé représentant la classe, et la valeur représentant le nom de fichier qui définit la classe. En revanche, l'autochargeur standard est conçu pour contenir une liste des espaces de nommage et des répertoires de base. Ce qui est fait construire le chemin de la classe référencée, mais pas encore chargé, par en ajoutant le chemin du répertoire de base pour cet espace de noms au nom de classe , pour arriver au chemin absolu final du fichier de classe, qui il essaie ensuite d'inclure. Vous pouvez remplir rapidement le fichier classmap_autoload.php en exécutant soit /path/to/ZF2/bin/classmap_generator.php ou zftool.phar générer classmap.

Zend\Loader\AutoloaderFactory est conçu pour gérer les différents autoloaders, et assurez-vous qu'il n'y a pas de conflits. En fin de compte, bien sûr, toutes les capacités de chargement automatique tirent parti de l'autoloading de PHP SPL.

Le but de getAutoloaderConfig() est d'identifier dans la fabrique d'autochargeur quels autochargeurs sont disponibles pour l'espace de nom de ce module.

Dans l'exemple ci-dessus, il s'agirait, dans l'ordre de préférence, de l'autochargeur classmap, suivi de l'autochargeur standard. Si vous ne souhaitez pas utiliser l'autochargeur classmap pour ce module, supprimez simplement la référence du tableau renvoyé par getAutoloaderConfig().

Le nom de la méthode getAutoloaderConfig() est réservé. Si cette méthode est définie, pendant le processus d'initialisation du module, un écouteur (Zend\ModuleManager\AutoloaderListener) est attaché qui récupère la configuration retournée par cette méthode et l'ajoute à la configuration consolidée.

+0

+1 Explication très claire et simple. – Andy0708

3

Une application Web comprend plusieurs classes PHP et chaque classe réside généralement dans un fichier distinct. Cela introduit le besoin de y compris les fichiers. Au fur et à mesure que la taille de votre application augmente, il peut être difficile d'inclure à chaque fichier requis. Zend Framework 2 lui-même se compose de centaines de fichiers, et il peut être très difficile de charger la totalité de la bibliothèque et toutes ses dépendances de cette façon. De plus, lors de l'exécution du code résultant, l'interpréteur PHP prendra le temps CPU pour traiter chaque fichier inclus, même si vous ne créez pas une instance de sa classe.

Pour résoudre ce problème, en PHP 5.1, la fonctionnalité de chargement automatique de classe a été introduite. La fonction PHP spl_autoload_register() vous permet d'enregistrer une fonction autoloader. Pour les sites Web complexes, vous pouvez même créer plusieurs fonctions de chargeur automatique, qui sont chaînées dans une pile.

Pendant l'exécution du script, si l'interprète PHP rencontre un nom de classe qui n'a pas encore été défini, il appelle toutes les fonctions du chargeur automatique enregistrés à son tour, jusqu'à ce que la fonction de chargement automatique inclut la classe ou « not found » erreur est élevé. Cela permet un chargement "paresseux", lorsque l'interpréteur PHP traite la définition de classe uniquement au moment de l'invocation de classe, quand cela est vraiment nécessaire.

Parce que chaque Vendor de la bibliothèque utilise ses propres conventions de nommage de code et d'organisation de fichiers, vous devrez enregistrer une autre fonction de chargeur automatique personnalisé par chaque bibliothèque dépendante, qui est assez ennuyeux (et en fait c'est un travail inutile). Pour résoudre ce problème, la norme PSR-0 a été introduite.

Le PSR-0 standard (PSR signifie normes PHP Recommandation) définit la structure de code recommandé une application ou d'une bibliothèque doivent suivre pour garantir l'interopérabilité des chargeurs automatiques.

Chaque module de l'application Web enregistre un autochargeur, ce qui permet de charger automatiquement toute classe PHP dans vos modules. Ceci est fait avec la méthode getAutoloaderConfig() de la classe Module.

ZF2 a une composante spéciale appelée Zend\Loader, qui contient des implémentations des deux classes de autochargeur couramment utilisés: le chargeur automatique standard (Zend\Loader\StandardAutoloader) et carte de classe autochargeur (Zend\Loader\ClassMapAutoloader).

Le fait que les modules d'application basés sur ZF2 se conforment à la norme PSR-0 permet d'utiliser l'autochargeur standard.

L'autochargeur de carte peut être utilisé comme remplacement plus rapide de l'autochargeur standard. Cet autochargeur attend que vous lui transmettiez un tableau de classes. Chaque paire key => value de la classe map est, respectivement, le nom de la classe et le chemin d'accès au fichier PHP contenant la classe.

Le concept d'auto-chargement dans Zend Framework 2 est bien expliqué dans Using Zend Framework 2 book.