Efficace PHP automatique de chargement et de stratégies de noms
Comme la plupart des développeurs web ces jours-ci, je suis à fond en profitant des avantages de la solide architecture MVC pour les applications web et des sites. Lorsque vous faites MVC en PHP, le chargement automatique de toute évidence est extrêmement pratique.
Je suis devenu un fan de spl_autoload_register
plus simplement de définir un seul __autoload()
fonction, comme c'est évidemment plus souple si vous êtes en intégrant différents modules de base que chaque utilisation de leur propre auto-chargement. Cependant, je n'ai jamais ressenti une grande sur les fonctions de chargement que j'écris. Elles impliquent beaucoup de cordes vérification et le répertoire de la numérisation afin de rechercher des classes à charger.
Par exemple, disons que j'ai une application qui a un chemin d'accès de base défini comme PATH_APP
, et d'une structure simple, avec des répertoires nommés models
, views
et controllers
. J'utilise souvent une structure de nommage où les fichiers sont nommés IndexView.php
et IndexController.php
à l'intérieur du répertoire approprié, et les modèles n'ont généralement pas d'un régime particulier, par défaut. Je pourrais avoir un chargeur de fonction de cette structure comme celle-ci qui s'inscrit avec spl_autoload_register
:
public function MVCLoader($class)
{
if (file_exists(PATH_APP.'/models/'.$class.'.php')) {
require_once(PATH_APP.'/models/'.$class.'.php');
return true;
}
else if (strpos($class,'View') !== false) {
if (file_exists(PATH_APP.'/views/'.$class.'.php')) {
require_once(PATH_APP.'/views/'.$class.'.php');
return true;
}
}
else if (strpos($class,'Controller') !== false) {
if (file_exists(PATH_APP.'/controllers/'.$class.'.php')) {
require_once(PATH_APP.'/controllers/'.$class.'.php');
return true;
}
}
return false;
}
Si il ne l'est pas après, j'ai peut être une autre fonction pour scanner les sous-répertoires dans le répertoire des modèles. Cependant, tous les if/else-ing, chaîne de la vérification et de l'examen de répertoire semble inefficace pour moi, et je voudrais l'améliorer.
Je suis très curieux de ce que les noms de fichier et le chargement automatique des stratégies d'autres développeurs peuvent utiliser. Je suis à la recherche spécifiquement pour les bonnes techniques à employer pour l'efficacité de chargement automatique, et non pas d'options pour le chargement automatique.
Vous devez vous connecter pour publier un commentaire.
C'est ce que j'utilise dans tous mes projets (obtenus directement à partir de la source de la dernière):
Si je regarde pour SomeClass_SeperatedWith_Underscores, il va chercher SomeClass_SeperatedWith_Underscores.php suivie par SomeClass/SeperatedWith/Underscores.php enracinée dans chaque répertoire dans l'actuel chemin de l'.
EDIT: je voulais juste mis là-bas que je l'utiliser pour l'efficacité du développement, et pas forcément le temps de traitement. Si vous avez POIRE sur votre chemin puis avec cela, vous pouvez simplement utiliser les classes et n'ont pas à inclure lorsque vous en avez besoin.
J'ai tendance à garder mes classes dans une hiérarchie de répertoires, avec des traits de soulignement, à casser des espaces de noms... Ce code me permet de garder la structure du fichier agréable et bien rangé, si je veux, ou pour injecter rapidement un fichier de classe sans répertoires imbriqués si je veux (pour l'ajout d'une seule classe ou deux à une bibliothèque qu'il est défendeur, mais ne fait pas partie du projet, je suis actuellement en train de travailler sur.)
array_unique()
autour de votre$files
tableau. Si il n'y a pas de trait de soulignement dans le nom de la classe, vous êtes en essayant chaque fichier deux fois.J'ai atterri sur cette solution:
J'ai créé un script unique qui traverse ma bibliothèque de classe dossier (qui contient des sous-dossiers pour les modules séparés /systèmes), et analyse le contenu des fichiers à la recherche de définitions de classe. Si elle trouve une définition de classe dans un fichier php (assez simple expression régulière pattern), il crée un lien symbolique:
Cela me permet d'utiliser une simple fonction autoload qui a besoin seulement le nom de la classe et le chemin d'accès au principal, le lien symbolique du dossier, et n'a pas à faire tout le chemin/de manipulation de chaîne.
La meilleure partie est que je peux réorganiser mon code source entièrement ou en ajouter un nouveau sous-système et exécutez simplement le lien de génération de script pour avoir tout chargé.
mklink
pour créer des liens symboliques sous Windows: howtogeek.com/howto/windows-vista/...Si vous voulez de l'efficacité, alors vous ne devriez pas être à l'aide de la fonction de chargement automatique à tous. La fonction de chargement automatique pour être paresseux. Vous devez fournir un chemin d'accès explicite à vos fichiers lorsque vous les inclure. Si votre fonction autoload pouvez trouver ces fichiers, alors vous pourriez le code pour trouver explicitement. Lorsque vous travaillez sur le point de vue de la partie du code et sur le point de charger un nouveau point de vue de classe, en laissant le chargement automatique de la fonction de la gérer, il suppose que la classe est une classe de modèle? C'est inefficace. Au lieu de votre code devrait être:
Si vous avez besoin de plusieurs "voir" les chemins, faire une fonction qui se charge de vues:
En tout cas, au point où l'include se produit, vous avez le plus grand/plus d'information précise sur la catégorie que vous souhaitez charger. En utilisant cette information pour charger la classe pleinement est la seule efficace de chargement de classe de la stratégie. Oui, vous pouvez vous retrouver avec plus de variables de classe ou (à dieu ne plaise) des variables globales. Mais c'est un meilleur compromis que juste de la paresse et de la numérisation des pièces du système de fichiers pour votre classe.