2010-09-21 23 views
6

J'ai un interpréteur de commande en php. Il vit dans le répertoire des commandes et doit avoir accès à toutes les commandes du fichier de commandes. Actuellement, j'appelle require une fois sur chaque commande.Y compris un répertoire entier en PHP ou Wildcard pour une utilisation en PHP Inclure?

require_once('CommandA.php'); 
require_once('CommandB.php'); 
require_once('CommandC.php'); 

class Interpreter { 
    // Interprets input and calls the required commands. 
} 

Faut-il inclure toutes ces commandes avec un seul require_once? J'ai un problème similaire à beaucoup d'autres endroits dans mon code (avec des usines, des constructeurs, d'autres interprètes). Il n'y a rien d'autre que des commandes dans ce répertoire et l'interpréteur a besoin de tous les autres fichiers du répertoire. Y at-il un joker qui peut être utilisé dans require? Tels que:

require_once('*.php'); 

class Interpreter { //etc } 

Y at-il un autre moyen de contourner cela qui n'implique pas vingt lignes d'inclusion en haut du fichier?

Répondre

4

Pourquoi voulez-vous faire cela? N'est-ce pas une meilleure solution d'inclure uniquement la bibliothèque lorsque vous en avez besoin pour augmenter la vitesse et réduire l'empreinte?

Quelque chose comme ceci:

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 whatever else you want here. 
    } 
} 
+0

Bloody brillant. Je n'aurais pas pensé à celui-là - plutôt stupide de ma part, puisque ma structure de nommage et de répertoire est déjà configurée pour faire exactement cela. Je n'aurais tout simplement pas pensé à conditionnellement. Je suppose que c'est mon ancien état d'esprit C qui me cause encore des problèmes ... –

+8

Une solution [autoload] (http://de.php.net/manual/en/function.spl-autoload-register.php) serait cependant un peu plus élégante. – Gordon

+0

Je suis d'accord, mais seulement si le code à l'intérieur de chaque commande .php est bien orienté objet. – thomasmalt

2

Vous pouvez inclure tous les fichiers en utilisant foreach()
magasin tous les nom de fichiers dans le tableau.

$array = array('read','test'); 

foreach ($array as $value) { 
    include_once $value.".php"; 
} 
17
foreach (glob("*.php") as $filename) { 
    require_once $filename; 
} 

Je serais prudent avec quelque chose comme ça si et préfère toujours « manuellement » y compris les fichiers. Si c'est trop lourd, peut-être que certains refactoring sont en ordre. Une autre solution peut être autoload classes.

+0

Quel est le danger de faire quelque chose comme le glob ci-dessus? –

+1

@Daniel: Il y a de fortes chances que vous ayez besoin de beaucoup de sources qui seront inutilisées. – fabrik

+5

Cela vous ouvre la porte aux failles de sécurité si quelqu'un est capable de placer un fichier .php dans l'un des répertoires include, peut-être en exploitant une autre vulnérabilité quelque part. Cela rend également plus difficile le suivi de ce qui est inclus. – deceze

7

Vous ne pouvez pas require_once un joker, mais vous pouvez trouver tous les fichiers programme dans ce répertoire et les obliger dans une boucle

foreach (glob("*.php") as $filename) { 
    require_once($filename) ; 
} 

http://php.net/glob

+1

+ 1 explication, lien vers TFM, répond réellement à la question –

0

Il est 2015 maintenant, vous êtes le plus courant probable PHP> = 5. Dans ce cas, comme mentionné à plusieurs reprises ci-dessus, la capacité de chargement automatique de PHP est une bonne solution, probablement le meilleur. Il a été créé spécifiquement pour que vous n'ayez pas à écrire une fonction utilitaire pour le chargement automatique. Cependant, comme mentionné dans les documents PHP, __autoload n'est plus recommandé et peut être déprécié dans les futures versions. Tant que vous utilisez PHP> = 5.1.2, utilisez plutôt spl_autoload_register.