2009-03-05 22 views
4

Quelle solution recommanderiez-vous pour inclure des fichiers dans un projet PHP?Importer un paquet ou un chargement automatique pour PHP?

  1. Il n'y a pas d'appels manuels d'exiger/include fonctions - charges tout grâce à des fonctions de chargement automatique
  2. importation du paquet, en cas de besoin.

Voici le paquet API importation:

import('util.html.HTMLParser'); 
import('template.arras.*'); 

Dans cette déclaration de fonction, vous pouvez exploser la chaîne avec des points (hiérarchie package délimiteur), une boucle à travers les fichiers paquet particulier (dossier) pour inclure un seul d'entre eux ou tous si le symbole astérisque est trouvé à la fin de la chaîne, par exemple ('template.arras. *'). L'un des avantages que je peux voir dans la méthode d'importation de paquetages est qu'il peut vous forcer à utiliser une meilleure décomposition d'objet et un meilleur regroupement de classes.

L'un des inconvénients que je peux voir dans la méthode de chargement automatique - est que la fonction de chargement automatique peut devenir très grande et pas très évident/lisible.

Qu'en pensez-vous?

  • Quels avantages/inconvénients pouvez-vous nommer dans chacune de ces méthodes?
  • Comment puis-je trouver la meilleure solution pour le projet?
  • Comment puis-je savoir s'il y aura des problèmes de performances si la gestion des paquets est utilisée?
+0

une autre question sur ce sujet: http://stackoverflow.com/questions/791899/efficient-php-auto-loading-and-naming-strategies – grossvogel

Répondre

4

J'utilise __autoload() de manière extensive. La fonction autload que nous utilisons dans notre application a quelques modifications pour la compatibilité ascendante des classes plus anciennes, mais nous suivons généralement une convention lors de la création de nouvelles classes qui permettent la autoload() fonctionner assez seemlessly:

  • Classe Conformément Nommer: chaque classe dans son propre fichier, chaque classe est nommée avec chameau-cas séparés par un trait de soulignement. Cela correspond au chemin de la classe. Par exemple, Some_CoolClass correspond à notre répertoire de classe puis 'Some/CoolClass.class.php'. Je pense que certains cadres utilisent cette convention.
  • Explicitement besoin de classes externes: puisque nous n'avons aucun contrôle sur le nom des bibliothèques externes que nous utilisons, nous les chargeons en utilisant la fonction require_once() de PHP. Rouler votre propre système d'emballage est probablement une mauvaise idée.
0

Je vous suggère fortement de faire ce qui suit à la place:

Throw toutes vos classes dans un tableau statique, className => filepath/ClassFile. La fonction de chargement automatique peut l'utiliser pour charger des classes.

Cela garantit que vous chargez toujours le nombre minimum de fichiers. Cela signifie également que vous évitez les noms de classe complètement stupides, et l'analyse de ces noms. Si c'est lent, vous pouvez lancer sur un accélérateur, et cela vous rapportera beaucoup plus, s'il est encore lent, vous pouvez exécuter des choses à travers un processus de 'compilation', où les fichiers souvent utilisés sont simplement déversés dans fichiers communs, et les références de chargement automatique peuvent être mises à jour pour pointer vers l'endroit correct. Si vous commencez à rencontrer des problèmes où votre chargement automatique est trop lent, ce que je trouve difficile à croire, vous pouvez le diviser en fonction des paquets, et avoir plusieurs fonctions de chargement automatique, de cette façon, seuls les sous-ensembles de la matrice sont requis. fonctionne mieux si vos paquets sont définis autour des modules de votre logiciel (login, admin, email, ...)

1

La méthode d'importation est une amélioration, mais charge encore plus que nécessaire.
Soit en utilisant l'astérisque ou de les charger dans le début du script (parce que l'importation avant chaque « nouvelle Classname » deviendra lourd)

Je suis un fan de __autoload() ou encore mieux spl_autoload_register()
Parce qu'il inclura seulement les classes que vous utilisez et l'avantage supplémentaire de ne pas se soucier où la classe est située.Si vos collèges déplace un fichier vers un autre répertoire, vous n'êtes pas affecté. L'inconvénient est qu'il a besoin d'une logique supplémentaire pour le faire fonctionner correctement avec les répertoires.

0

Je ne suis pas fan de __autoload(). Dans de nombreuses bibliothèques (certaines bibliothèques PEAR, par exemple), les développeurs utilisent class_exists() sans passer dans le second paramètre relativement nouveau. Tout code hérité que vous avez peut également avoir ce problème. Cela peut provoquer des avertissements et des erreurs si vous avez défini un __autoload().

Si vos bibliothèques sont claires et que vous n'avez pas de code hérité à gérer, c'est un outil fantastique. Je souhaite parfois PHP avait été un peu plus intelligent sur la façon dont ils ont géré le comportement de class_exists(), parce que je pense que le problème est avec cette fonctionnalité plutôt que __autoload().

1

J'utilise require_once (« ../ chemin à chargement automatique-script.php.inc ») avec chargement automatique

J'ai une convention de nommage standard pour toutes les classes et les fichiers inc qui le rend plus facile pour déterminer par programme quel nom de classe est actuellement demandé.

par exemple, toutes les classes ont une certaine extension comme inc.php
(donc je sais qu'ils seront dans le répertoire/CCRS)
et
tous les fichiers inc commencent par .ht (donc ils être dans le répertoire/inc)

La fonction de chargement automatique accepte un paramètre: className, que j'utilise ensuite pour déterminer où le fichier se trouve réellement. boucle une fois que je sais ce que mon répertoire cible est, chaque fois ajoutant "../" pour tenir compte des sous-pages secondaires, (qui a semblé casser la charge automatique pour moi) et finalement require_once'ing le fichier de code réel une fois trouvé.

0

Je proposerais que vous alliez avec les inclus manuels explicites, ou avec le chargement automatique (ou une combinaison d'ailleurs).