Включение всего каталога в PHP или Wildcard для использования в PHP Включить?

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

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

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

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

require_once('*.php');

class Interpreter { //etc }

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

Ответы на вопрос(5)

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

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

 Daniel Bingham21 сент. 2010 г., 09:20
@deceze Достаточно справедливо.
 Daniel Bingham21 сент. 2010 г., 09:13
В чем опасность делать что-то вроде вышеупомянутого шарика?
 thomasmalt21 сент. 2010 г., 09:16
@daniel: я бы постарался включить только те файлы, которые были необходимы. Смотрите мой ответ ниже.
 Daniel Bingham21 сент. 2010 г., 09:17
@fabrik Маловероятно, что структура каталога разработана таким образом, что этот каталог содержит только командные файлы, используемые этим интерпретатором. Не больше, не меньше.
 don.najd10 авг. 2016 г., 20:32
НИКОГДА не делайте этого ... имея дело с огромным устаревшим кодом прямо сейчас, и если бы кто-то сделал это, я бы заплакал
 deceze21 сент. 2010 г., 09:15
Он открывает вам уязвимости безопасности, если кто-то может поместить файл .php в один из каталогов включения, возможно, за счет использования другой уязвимости где-нибудь. Это также усложняет отслеживание того, что и где включено.
 fabrik21 сент. 2010 г., 09:14
@Daniel: есть большая вероятность, что вам понадобится много источников, которые не будут использоваться.

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

но вы можете программно найти все файлы в этом каталоге и затем потребовать их в цикле

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

http://php.net/glob

 Bob Stein16 мар. 2013 г., 20:29
+1 объяснение, ссылка на TFM, на самом деле отвечает на вопрос

используя foreach ()
Храните все файлы с именем в массиве.

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

foreach ($array as $value) {
    include_once $value.".php";
}
Решение Вопроса

огда, когда она нужна для увеличения скорости и уменьшения занимаемой площади?

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

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.
    }
}
 Gordon21 сент. 2010 г., 09:31
автозагрузка решение будет несколько более элегантным, хотя.
 thomasmalt21 сент. 2010 г., 09:37
Я согласен, но только если код внутри каждой команды <Foo> .php является объектно-ориентированным.
 Daniel Bingham21 сент. 2010 г., 09:20
Чертовски блестящий. Не подумал бы об этом - довольно глупо с моей стороны, поскольку моя структура имен и каталогов уже настроена именно на это. Я просто не подумал бы об условно включенном. Полагаю, это мое старое мышление С снова вызывает у меня проблемы ...

Ваш ответ на вопрос