Включение всего каталога в PHP или Wildcard для использования в PHP Включить? - PullRequest
6 голосов
/ 21 сентября 2010

У меня есть интерпретатор команд в 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 }

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

Ответы [ 5 ]

18 голосов
/ 21 сентября 2010
foreach (glob("*.php") as $filename) {
    require_once $filename;
}

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

7 голосов
/ 21 сентября 2010

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

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

http://php.net/glob

5 голосов
/ 21 сентября 2010

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

Примерно так:

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.
    }
}
2 голосов
/ 21 сентября 2010

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

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

foreach ($array as $value) {
    include_once $value.".php";
}
0 голосов
/ 21 мая 2015

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

...