2010-09-21 2 views
6

У меня есть интерпретатор команд в php. Он живет внутри каталога команд и нуждается в доступе к каждой команде в файле команд. В настоящее время я вызываю запрос один раз для каждой команды.Включая весь каталог в PHP или подстановочный знак для использования в PHP Include?

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

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

Возможно ли каким-либо образом включить все эти команды с помощью одного require_once? У меня есть аналогичная проблема со многими другими местами в моем коде (с заводами, строителями, другими интерпретаторами). В этом каталоге нет ничего, кроме команд, и интерпретатору нужен каждый другой файл в каталоге. Есть ли подстановочный знак, который может использоваться в требовании? Такие как:

require_once('*.php'); 

class Interpreter { //etc } 

Есть ли другой способ обойти это, что не включает в себя двадцать строк, включенных в верхней части файла?

ответ

4

Почему вы хотите это сделать? Разве это не лучшее решение для включения библиотеки только в том случае, если она нуждается в увеличении скорости и уменьшении следа?

Что-то вроде этого:

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

Кровавый блестящий. Не думал бы об этом - довольно глупо, потому что моя структура имен и каталогов уже настроена так, чтобы делать именно это. Я бы даже не подумал об условном включении. Угадайте, что это мой старый образ C, который снова вызывает проблемы ... –

+8

Решение [autoload] (http://de.php.net/manual/en/function.spl-autoload-register.php) было бы несколько более элегантным. – Gordon

+0

Согласен, но только если код внутри каждой команды .php ориентирован на объект. – thomasmalt

2

Вы можете включить все файлы, используя foreach()
Сохраните все имена файлов в массиве.

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

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

я был бы осторожен с чем-то вроде этого, хотя и всегда предпочитаю «вручную» в том числе файлов. Если это слишком обременительно, возможно, какой-то рефакторинг в порядке. Другим решением может быть autoload classes.

+0

В чем опасность при выполнении чего-то вроде вышеуказанного шара? –

+1

@ Даниэль: Есть большой шанс, что вам понадобится много источников, которые не будут использоваться. – fabrik

+5

Это открывает вам уязвимости безопасности, если кто-то может поместить файл .php в один из каталогов include, возможно, используя где-то другую уязвимость. Это также затрудняет отслеживание того, что включено в него. – deceze

7

Вы не можете require_once уайлдкарда, но вы можете программно найти все файлы в этом каталоге, а затем требуют их в цикле

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

http://php.net/glob

+1

+1 пояснение, ссылка на TFM, на самом деле отвечает на вопрос –

0

Это 2015 сейчас, так что вы, скорее всего, работает PHP> = 5. Если это так, как было упомянуто несколько раз выше, возможность автозагрузку PHP является хорошим решением, вероятно, лучший. Он был создан специально, поэтому вам не придется писать служебную функцию для автоматической загрузки. Однако, как упоминалось в документах PHP, __autoload больше не рекомендует и может быть обесценен в будущих версиях. Пока вы используете PHP> = 5.1.2, вместо этого используйте spl_autoload_register.