2010-09-21 10 views
6

Mam interpretera poleceń w php. To żyje wewnątrz katalogu poleceń i potrzebuje dostępu do każdego polecenia w pliku poleceń. Obecnie dzwonię wymagać raz na każde polecenie.W tym cały katalog w PHP lub Wildcard do użycia w PHP Include?

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

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

Czy jest jakiś sposób uwzględnienia wszystkich tych poleceń za pomocą pojedynczego elementu require_once? Mam podobny problem w wielu innych miejscach w moim kodzie (z fabrykami, budowniczymi, innymi tłumaczami). W tym katalogu nie ma nic oprócz poleceń, a interpreter potrzebuje każdego innego pliku w katalogu. Czy istnieje symbol wieloznaczny, którego można użyć w razie potrzeby? Takich jak:

require_once('*.php'); 

class Interpreter { //etc } 

Czy jest jakiś inny sposób obejścia tego problemu, który nie obejmuje dwudziestu wierszy pliku na górze pliku?

Odpowiedz

4

Dlaczego chcesz to zrobić? Czy nie jest lepszym rozwiązaniem włączenie biblioteki tylko wtedy, gdy jest ona potrzebna, aby zwiększyć prędkość i zmniejszyć ślad?

coś takiego:

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

Krwawe genialne. Nie pomyślałbym o tym - raczej głupio ode mnie, ponieważ moje nazewnictwo i struktura katalogów jest już skonfigurowana, aby zrobić dokładnie to. Po prostu nie pomyślałbym o warunkowym włączeniu. Zgadnij, że to mój stary sposób myślenia sprawiający mi problemy ponownie ... –

+8

Rozwiązanie [autoload] (http://de.php.net/manual/en/function.spl-autoload-register.php) byłoby jednak nieco bardziej eleganckie. – Gordon

+0

Zgadzam się, ale tylko wtedy, gdy kod wewnątrz każdego polecenia .php jest zorientowany obiektowo. – thomasmalt

2

Możesz dołączyć wszystkie pliki za pomocą foreach()
Zapisz wszystkie nazwy plików w tablicy.

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

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

Byłbym ostrożny z czymś takim, że choć i zawsze wolą „ręcznie”, w tym plików. Jeśli to zbyt uciążliwe, być może jest trochę refaktoryzacji. Innym rozwiązaniem może być autoload classes.

+0

Jakie niebezpieczeństwo wiąże się z robieniem czegoś podobnego do powyższego globu? –

+1

@Daniel: Istnieje duża szansa, że ​​będziesz potrzebował wielu źródeł, które nie będą używane. – fabrik

+5

To otwiera cię na luki w zabezpieczeniach, jeśli ktoś jest w stanie umieścić plik .php w jednym z katalogów dołączających, być może przez wykorzystanie innej luki. Utrudnia to również śledzenie tego, co jest zawarte w miejscu. – deceze

7

Nie można require_once symbol wieloznaczny, ale można programowo znaleźć wszystkie pliki w tym katalogu, a następnie wymagać ich w pętli

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

http://php.net/glob

+1

+1 wyjaśnienie, link do TFM, faktycznie odpowiada na pytanie –

0

To 2015 teraz, więc jesteś najprawdopodobniej działa PHP> = 5. Jeśli tak, jak wspomniano powyżej, kilka razy, zdolność autoload PHP jest dobrym rozwiązaniem, prawdopodobnie najlepszy. Został stworzony specjalnie, więc nie musisz pisać funkcji narzędzia do automatycznego ładowania. Jednak, jak wspomniano w dokumentacji PHP, __autoload nie jest już zalecany i może być amortyzowany w przyszłych wersjach. Dopóki używasz PHP> = 5.1.2, zamiast tego użyj spl_autoload_register.