У меня есть интерпретатор команд в 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_once('*.php'); class Interpreter { //etc }
Есть ли другой способ вокруг этого, который не включает двадцать строк include в верхней части файла?
Почему вы хотите это сделать? Разве это не лучшее решение для включения библиотеки только в том случае, если она нуждается в увеличении скорости и уменьшении следа?
Что-то вроде этого:
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. } }
foreach (glob("*.php") as $filename) { require_once $filename; }
Я был бы осторожен с чем-то подобным, хотя и всегда предпочитаю «вручную», включая файлы. Если это слишком обременительно, возможно, какой-то рефакторинг в порядке. Другим решением может быть автозагрузка классов .
Вы не можете require_once подстановочный знак, но вы можете программно найти все файлы в этом каталоге, а затем потребовать их в цикле
foreach (glob("*.php") as $filename) { require_once($filename) ; }
Вы можете включить все файлы, используя foreach ()
Храните все имена файлов в массиве.
$array = array('read','test'); foreach ($array as $value) { include_once $value.".php"; }
Сейчас 2015 год, поэтому вы, скорее всего, используете PHP> = 5. Если это так, как уже упоминалось несколько раз выше, возможности автозагрузки PHP являются хорошим решением, вероятно, лучшим. Он был создан специально, поэтому вам не придется писать служебную функцию для автоматической загрузки. Однако, как упоминалось в документах PHP, __autoload больше не рекомендуется и может быть обесценена в будущих версиях. Пока вы используете PHP> = 5.1.2, вместо этого используйте spl_autoload_register .