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
bonne question ..... intéressé d'entendre les réponses aussi! :) – KyleK