J'ai un interprète de commandement en PHP. Il vit dans le répertoire des commandes et a besoin d'accéder à chaque commande dans le fichier de commande. Actuellement, j'appelle requis une fois sur chaque commande.
require_once('*.php'); class Interpreter { //etc }
5 Réponses :
Vous pouvez inclure tous les fichiers à l'aide de pourcheche ()
de
Stockez tous les fichiers Nom en tableau.
$array = array('read','test'); foreach ($array as $value) { include_once $value.".php"; }
foreach (glob("*.php") as $filename) { require_once $filename; } I'd be careful with something like that though and always prefer "manually" including files. If that's too burdensome, maybe some refactoring is in order. Another solution may be to autoload classes.
Quel est le danger pour faire quelque chose comme le glob globe ci-dessus?
@Daniel: Il y a une grande chance que vous aurez besoin de nombreuses sources qui ne seront pas utilisées.
Il vous ouvre des vulnérabilités de sécurité si quelqu'un est capable de placer un fichier .php dans l'un des annuaires inclus, éventuellement en exploitant une autre vulnérabilité quelque part. Cela rend également plus difficile de garder une trace de ce qui est inclus où.
@Daniel: J'essaierais d'inclure uniquement les fichiers nécessaires à la conditionntion. Voir ma réponse ci-dessous.
@fabrik n'est pas probable ici, la structure de répertoire est conçue de telle sorte que ce répertoire contient uniquement les fichiers de commande utilisés par cet interprète. Ni plus ni moins.
Ne faites jamais cela ... Traiter avec un énorme code hérité en ce moment et si quelqu'un a fait cela, je pleurerais
Vous ne pouvez pas nécessiter que vous ne trouvez pas de caractères génériques, mais vous pouvez trouver programmatiquement tous les fichiers dans ce répertoire, puis les nécessiter dans une boucle http://php.net/glob p> p>
Pourquoi voulez-vous faire ça? N'est-ce pas une meilleure solution pour inclure uniquement la bibliothèque lorsque cela n'ait pas besoin d'augmenter la vitesse et de réduire l'empreinte de pas?
quelque chose comme ceci: p>
Class Interpreter { public function __construct($command = null) { $file = 'Command'.$command.'.php'; if (!file_exists($file)) { throw new Exception('Invalid command passed to constructor'); } include_once $file; // do other code here. } }
Sanglant brillant. N'aurait pas pensé à celui-là - plutôt stupide de moi, puisque ma structure de nommée et de répertoire est déjà configurée pour faire exactement cela. Je n'aurais tout simplement pas pensé de conditionnellement compris. Devinez que c'est mon ancien état d'esprit C me causant à nouveau des problèmes ...
Un Solution automatique serait quelque peu plus élégante cependant.
Je suis d'accord, mais seulement si le code à l'intérieur de chaque commande
C'est à 2015 maintenant, vous êtes donc probablement en cours d'exécution PHP> = 5. Si oui, comme mentionné quelques fois plus haut, la capacité de l'autoload de PHP est une bonne solution, probablement le meilleur. Il a été créé spécifiquement pour ne pas avoir à écrire une fonction d'utilité pour le chargement automatique. Cependant, comme mentionné dans les documents PHP, __autoload n'est plus recommandé et peut être amorti dans les versions futures. Tant que vous utilisez php> = 5.1.2, utilisez spl_autoload_register < / a> à la place. p>