2010-03-16 3 views
2

J'essaie de trouver la meilleure approche pragmatique pour importer des fonctions à la volée ... laissez-moi vous expliquer.Fonctions d'importation PHP

que j'ai un répertoire appelé fonctions qui a ces fichiers:

array_select.func.php 
stat_mediam.func.php 
stat_mean.func.php 
..... 

Je voudrais: charger chaque fichier (qui a une fonction définie à l'intérieur) et de l'utiliser comme un Une fois que je suis tombé sur un tutoriel (que je ne retrouve pas maintenant) qui compilé les fonctions définies par l'utilisateur dans le cadre d'une installation PHP .. Bien que ce ne soit pas une très bonne solution car sur partagé/res eller hosting vous ne pouvez pas recompiler l'installation de PHP. Je ne veux pas avoir de conflits avec les futures versions de PHP/autres extensions, c'est-à-dire si une fonction nommée X par moi fait soudainement partie des fonctions internes de PHP (même si elle n'a pas la même fonctionnalité en soi)) Je ne veux pas que PHP lance une erreur fatale à cause de cela et échoue lamentablement. Donc, la meilleure méthode que je peux penser est de vérifier si une fonction est définie, en utilisant function_exists(), si c'est le cas, lancez un avis afin qu'il soit facile à suivre dans les fichiers journaux, sinon définissez la fonction. Cependant, cela se traduira probablement par beaucoup d'instructions include/require dans d'autres fichiers où j'ai besoin d'une telle fonction, ce que je n'aime pas vraiment. Ou éventuellement, lisez le répertoire et bouclez chaque fichier * .func.php et include_once. Bien que je trouve cela un peu moche.

La question est, avez-vous déjà tombé sur un code source qui traitait un tel cas? Comment a-t-il été mis en œuvre Avez-vous déjà fait quelque chose de similaire? J'ai besoin d'autant d'idées que possible! :)

+0

Une raison particulière pour laquelle une classe ne ferait pas? Charger dynamiquement chaque fonction individuelle serait plus lent et plus difficile à maintenir, peut-être pas si pratique. – tadamson

+0

Je pourrais probablement finir par le faire de cette façon, par souci de maintenance. –

+0

considérant qu'il n'y avait pas beaucoup de réponses à cette question (pas que je sois surpris) je verrai ce que je peux trouver pour satisfaire vitesse/maintenabilité/praticabilité. Si je trouve une solution qui satisfait cela, je reviendrai et l'afficherai ici;) –

Répondre

3

Une façon de tirer quelque chose comme ceci est de mettre ces fonctions dans des classes, puis de configurer une fonction __autoload. Si vous êtes contre l'encapsulation des fonctions dans les classes, cette solution ne s'appliquera probablement pas à vous. Personnellement, je l'aime parce que cela me permet de nommer mes fonctions et de partager des méthodes privées entre eux.

Vous devez d'abord configurer votre fonction de chargement automatique similaire à celle-ci. Vous voudrez ajuster la convention de nommage pour l'adapter à votre propre style, et probablement introduire une gestion des erreurs, mais c'est juste pour faire passer l'idée de base.

function __autoload($class_name){ 
    require_once(strtolower("library/$class_name.class.php")); 
} 

Puis n'importe où dans votre code, quelle que soit la portée, vous pouvez faire quelque chose comme ça.

arrayFunctions::doStuff($myArray); 

PHP essaiera automatiquement d'inclure « bibliothèque/arrayFunctions.class.php » et recherchez une méthode appelée « doStuff » dans la classe arrayFunctions.

+0

cela peut être une façon de l'implémenter. mais pourquoi devrais-je avoir une classe qui va avoir une méthode statique? Je sais, je suis difficile à satisfaire. En fait, je me demande s'il est possible de passer les params à __construct() et d'obtenir une valeur de retour directement à partir de __construct() .. quelque chose comme appeler __toString(); lorsque vous essayez de faire écho à un objet. –

+0

Re "mais pourquoi devrais-je avoir une classe qui va juste avoir une méthode statique?" Vous pouvez (et devriez!) Mettre plus d'une méthode dans les classes. C'est génial du point de vue organisationnel car vous catégorisez essentiellement vos fonctions de cette façon. –

0

J'ai des problèmes avec cette idée. Frapper le système de fichiers pour inclure une seule fonction est très coûteux en termes de réduction de vos demandes maximum par seconde.

Il est généralement préférable de charger/analyser cinq fonctions dans un seul fichier (classe statique?) Et d'en utiliser seulement deux (un appel stat) plutôt que de charger deux fichiers pour deux fonctions (deux appels statistiques).

Ce qui devient évidemment encore pire lorsque vous avez besoin des cinq fonctions.

+0

donc dans ce cas, même la solution de Greg W souffre .. –

+0

Seulement si vous écrivez une fonction par classe, ce que je considère comme une utilisation assez abusive des classes. –

+0

Eh bien, je ne vois pas pourquoi vous devriez avoir un seul fichier avec toutes les classes et ensuite utiliser le chargement automatique. pourquoi ne pas simplement utiliser include/require en premier lieu alors? –

0
  1. Pour charger automatiquement des choses lorsque vous en avez besoin, placez vos fonctions dans des classes et utilisez l'autoloading.
  2. Pour le conflit de noms, utilisez des espaces de noms (si vous avez PHP 5.3).