2013-06-26 2 views
2

J'ai vu une série d'exemples utilisant le PSR pour effectuer le chargement automatique avec des espaces de noms. Peut-être que c'est une question stupide, mais pourquoi n'est-ce pas une mauvaise pratique? Cela ne va-t-il pas à l'encontre de l'objectif d'avoir des espaces de noms? Par exemple, disons que vous avez deux bibliothèques, FormBuilder et MySweetForms, et que les deux ont une classe Form. Les emplacements sont à:Pourquoi n'utilise pas les espaces de noms pour charger automatiquement une mauvaise pratique?

lib/FormBuilder/Core/Form.php et lib/MySweetForms/Form.php

Si vous autoload sur la base des namespaces ces Form cours sont, vous n'êtes pas allez courir dans le problème exact que les espaces de noms sont destinés à éviter: identificateurs ambigus des classes et les méthodes?

aura-t-il pas échouer lorsque vous localiser avec succès une autre classe dans l'espace de noms MySweetForms, disent AjaxFileField, qui repose sur \MySweetForms\Form, mais il trouve la mise en œuvre de FormBuilder de la classe Form?

+0

bonne question ..... intéressé d'entendre les réponses aussi! :) – KyleK

Répondre

0

En raison de namespaces, le chargement automatique ne trouvera pas la mise en œuvre de FormBuilder de la classe Form quand il cherche la mise en œuvre MySweetForms, à condition que le chargeur automatique et les deux bibliothèques suivent mieux (ou à proximité des meilleurs) pratiques et sont mises en œuvre correctement.

Si le fichier MySweetForms/AjaxFileField.php définit une classe dans l'espace de noms MySweetForms comme indiqué:

namespace MySweetForms; 

class AjaxFileField 
{ 
    public function doFormStuff() 
    { 
     $form = new Form(); 
    } 
} 

la référence à la classe Form à l'intérieur AjaxFileField est vraiment un raccourci pour le nom complet de la classe MySweetForms\Form.

Lorsque le chargeur automatique est invoqué pour charger la classe, il sera demandé de charger la classe en fonction de son nom complet. Un chargeur automatique PSR-0 se traduirait par la MySweetForms\Form classname dans le chemin MySweetForms/Form.php, et (à condition qu'il a été dit de regarder dans le répertoire lib), il trouverait son chemin vers le fichier correct. Si ce fichier était manquant, l'autochargeur échouerait finalement. De même, si ce fichier a défini une classe Form mais a négligé de fournir un espace de noms de la classe réelle (MySweetForms\Form) n'existerait pas (à la place, une classe mondiale Form serait) - qui ne correspond pas au nom complet de la classe visée à l' la classe AjaxFileField, donc une erreur se produirait.

Notez que si le code avait inclus $form = new \FormBuilder\Core\Form(); plutôt le nom de la classe serait déjà qualifié, et le chargeur automatique serait demandé de charger la classe FormBuilder\Core\Form (et s'attendre que ce soit dans le fichier FormBuilder/Core/Form.php).

Si nous avions utilisé $form = new \Form(); nous référerons à la classe Form dans l'espace de noms global et le chargeur automatique serait demandé de trouver Form (il regarderait dans le fichier Form.php directement dans le dossier lib à ce stade).

La clé est de reconnaître qu'il n'y a pas, vraiment, deux Form cours - il y a une classe avec un nom complet de FormBuilder\Core\Form et avec un nom complet de MySweetForms\Form - et un chargeur automatique correctement mis en œuvre s'attendra eux dans des endroits complètement différents, et ne tentera pas de charger un fichier à la place de l'autre.La combinaison des espaces de noms et du style PSR d'organisation des fichiers dans des répertoires basés sur leurs espaces de noms facilite la réutilisation des mots courants sans provoquer de conflits, et permet de mapper de façon prévisible les noms de classe complets aux fichiers correspondants. La résolution des noms de classe en noms de classe pleinement qualifiés est la clé de cette question, et est traitée dans le manuel de PHP (la FAQ de l'espace de noms a quelques points à ce sujet: http://www.php.net/manual/en/language.namespaces.faq.php). La norme PSR-0 elle-même est également une référence utile: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md

Questions connexes