2010-09-21 11 views
6

Ho un interprete di comandi in php. Vive all'interno della directory dei comandi e ha bisogno di accedere a ogni comando nel file di comando. Attualmente chiamo richiedono una volta su ogni comando.Includere un'intera directory in PHP o Wildcard per l'utilizzo in PHP Include?

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

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

C'è qualche modo di includere tutti questi comandi con una singola require_once? Ho un problema simile a molti altri posti nel mio codice (con fabbriche, costruttori, altri interpreti). Non ci sono nient'altro che comandi in questa directory e l'interprete ha bisogno di ogni altro file nella directory. C'è un carattere jolly che può essere utilizzato in richiedere? Ad esempio:

C'è un altro modo per aggirare questo che non coinvolge venti righe di includere nella parte superiore del file?

risposta

4

Perché vuoi farlo? Non è forse una soluzione migliore includere la libreria solo quando ne hai bisogno per aumentare la velocità e ridurre l'ingombro?

Qualcosa di simile a questo:

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 brilliant. Non avrei pensato a quello - piuttosto sciocco da parte mia, dal momento che la mia struttura di nomi e directory è già impostata per fare esattamente questo. Non avrei mai pensato di includere condizionatamente. Suppongo che sia la mia vecchia mentalità C a causare problemi di nuovo ... –

+8

Una soluzione [autoload] (http://de.php.net/manual/en/function.spl-autoload-register.php) sarebbe un po 'più elegante. – Gordon

+0

Sono d'accordo, ma solo se il codice all'interno di ogni comando .php è orientato agli oggetti. – thomasmalt

2

È possibile includere tutti i file utilizzando foreach()
Memorizza il nome di tutti i file nell'array.

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

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

Starei attento con una cosa del genere e anche se preferisco sempre "manualmente", inclusi i file. Se questo è troppo oneroso, forse è necessario qualche refactoring. Un'altra soluzione potrebbe essere autoload classes.

+0

Qual è il pericolo nel fare qualcosa come il glob sopra? –

+1

@Daniel: C'è una grande possibilità che richiediate molte fonti che non verranno utilizzate. – fabrik

+5

Ti apre le vulnerabilità della sicurezza se qualcuno è in grado di inserire un file .php in una delle directory di inclusione, eventualmente sfruttando un'altra vulnerabilità da qualche parte. Rende anche più difficile tenere traccia di ciò che è incluso dove. – deceze

7

Non è possibile require_once un jolly, ma è possibile a livello di codice trovare tutti i file in quella directory e poi li richiedono in un ciclo

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

http://php.net/glob

+1

+1, link a TFM, in realtà risponde alla domanda –

0

E '2015, in modo che stai molto probabilmente in esecuzione PHP> = 5. In caso affermativo, come detto un paio di volte in precedenza, la capacità di autoload di PHP è una buona soluzione, probabilmente il migliore È stato creato appositamente per non dover scrivere una funzione di utilità per il caricamento automatico. Tuttavia, come indicato nei documenti PHP, lo __autoload non è più consigliato e potrebbe essere ammortizzato nelle versioni future. Finché utilizzi PHP> = 5.1.2, utilizza invece spl_autoload_register.