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

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

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 }

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


person Daniel Bingham    schedule 21.09.2010    source источник


Ответы (5)


Почему вы хотите это сделать? Не лучше ли включать библиотеку только тогда, когда это необходимо для увеличения скорости и уменьшения занимаемой площади?

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

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.
    }
}
person thomasmalt    schedule 21.09.2010
comment
Чертовски блестяще. Не подумал бы об этом - довольно глупо с моей стороны, поскольку моя структура именования и каталогов уже настроена именно на это. Я бы просто не подумал об условном включении. Думаю, это мое старое мышление C снова вызывает у меня проблемы... - person Daniel Bingham; 21.09.2010
comment
Однако решение с autoload было бы более элегантным. - person Gordon; 21.09.2010
comment
Я согласен, но только если код внутри каждого Command‹Foo›.php является объектно-ориентированным. - person thomasmalt; 21.09.2010

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

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

person deceze♦    schedule 21.09.2010
comment
В чем опасность выполнения чего-то вроде вышеприведенного шара? - person Daniel Bingham; 21.09.2010
comment
@Daniel: Есть большая вероятность, что вам потребуется много источников, которые не будут использоваться. - person fabrik; 21.09.2010
comment
Это открывает вам доступ к уязвимостям безопасности, если кто-то может поместить файл .php в один из включаемых каталогов, возможно, используя где-то другую уязвимость. Это также затрудняет отслеживание того, что и куда включено. - person deceze♦; 21.09.2010
comment
@daniel: я бы попытался включить только те файлы, которые необходимы условно. Смотрите мой ответ ниже. - person thomasmalt; 21.09.2010
comment
@fabrik Здесь вряд ли, структура каталогов разработана таким образом, что этот каталог содержит только командные файлы, используемые этим интерпретатором. Ни больше ни меньше. - person Daniel Bingham; 21.09.2010
comment
НИКОГДА не делайте этого... Имея дело с огромным унаследованным кодом прямо сейчас, и если бы кто-то сделал это, я бы заплакал - person don.najd; 10.08.2016

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

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

http://php.net/glob

person Fanis Hatzidakis    schedule 21.09.2010

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

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

foreach ($array as $value) {
    include_once $value.".php";
}
person Oyeme    schedule 21.09.2010

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

person seanTcoyote    schedule 21.05.2015