2009-03-01 4 views
190

Очень быстрый вопрос n00b, в PHP я могу включить каталог скриптов.Как включить() все файлы PHP из каталога?

т.е. вместо:

include('classes/Class1.php'); 
include('classes/Class2.php'); 

есть что-то вроде:

include('classes/*'); 

не может показаться, чтобы найти хороший способ включения коллекции около 10 подклассов для определенного класса ,

ответ

364
foreach (glob("classes/*.php") as $filename) 
{ 
    include $filename; 
} 
+3

Я думал, что будет более чистый вид, используя include(). Но все будет хорошо. Всем спасибо. – occhiso

+5

Я бы построил правильную модульную систему с конфигурационным файлом, но это только потому, что я нахожу ее гораздо более гибкой, чем просто * * все *. :-) – staticsan

+3

Внимание, работает только для включения файлов в текущий каталог. Можно было бы пройти через get_include_path(), но это будет утомительно быстро. – nalply

0

Я предлагаю вам использовать функцию readdir(), а затем цикл и включить файлы (см. Первый пример на этой странице).

18

Если вы используете php 5, вы можете использовать вместо этого autoload.

49

Вот как я включаю много классов из нескольких папок в PHP 5. Это будет работать, только если у вас есть классы.

/*Directories that contain classes*/ 
$classesDir = array (
    ROOT_DIR.'classes/', 
    ROOT_DIR.'firephp/', 
    ROOT_DIR.'includes/' 
); 
function __autoload($class_name) { 
    global $classesDir; 
    foreach ($classesDir as $directory) { 
     if (file_exists($directory . $class_name . '.php')) { 
      require_once ($directory . $class_name . '.php'); 
      return; 
     } 
    } 
} 
+1

+1 для автозагрузки. [функция автозагрузки] (http://php.net/manual/en/function.autoload.php), [функция автозагрузки] (http://php.net/manual/en/language.oop5.autoload.php) –

+1

Autoload не имеет значения, потому что этот вопрос касался включения всего в каталог - обычно это было бы в разных каталогах: например, DataClass, определенный в каталоге BE, и BL.class.php, определенный в каталоге BL. – Carmageddon

+1

Использование globals не является решением – Peter

19

это просто модификация кода Карстен

function include_all_php($folder){ 
    foreach (glob("{$folder}/*.php") as $filename) 
    { 
     include $filename; 
    } 
} 

include_all_php("my_classes"); 
+9

Это не добавляет ничего, относящегося к принятому ответу. – moopet

+0

спасибо, что это был единственный код, который действительно работал по какой-то причине. –

9

Вы можете использовать set_include_path:

set_include_path('classes/'); 

http://php.net/manual/en/function.set-include-path.php

+12

Он не включает автоматически все php-файлы в каталоге, просто позволяет опустить 'classes /' при использовании 'include' /' require' – Gherman

-2

делать не написать функцию(), чтобы включить файлов в каталоге. Вы можете потерять переменные области и, возможно, придется использовать «глобальный». Просто зациклируйте файлы.

Кроме того, вы можете столкнуться с трудностями, когда включенный файл имеет имя класса, которое будет распространено на другой класс, определенный в другом файле, который еще не включен. Так что будь осторожен.

+1

Что вы подразумеваете под «потерять переменные области»? – piyush

+2

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

+0

очень хорошая точка для прицела !!! – Nick

26

Я понимаю, что это старая запись, НО ... НЕ СОДЕРЖАТЬ СВОИ КЛАССЫ ... вместо того, чтобы использовать __autoload

function __autoload($class_name) { 
    require_once('classes/'.$class_name.'.class.php'); 
} 

$user = new User(); 

Тогда всякий раз, когда вы вызываете новый класс, который не был включен еще РНР автоматический огонь __autoload и включить его для вас

0

Если вы ищете, чтобы включать в себя кучу классов без необходимости определять каждый класс сразу можно использовать:

$directories = array(
      'system/', 
      'system/db/', 
      'system/common/' 
); 
foreach ($directories as $directory) { 
    foreach(glob($directory . "*.php") as $class) { 
     include_once $class; 
    } 
} 

Таким образом, вы можете J ust определяет класс в файле php, содержащий класс, а не весь список $thisclass = new thisclass();

Что касается того, насколько хорошо он обрабатывает все файлы? Я не уверен, что с этим может быть небольшое снижение скорости.

1

Если вы хотите включить все в каталоге и его подкаталогах:

$dir = "classes/"; 
$dh = opendir($dir); 
$dir_list = array($dir); 
while (false !== ($filename = readdir($dh))) { 
    if($filename!="."&&$filename!=".."&&is_dir($dir.$filename)) 
     array_push($dir_list, $dir.$filename."/"); 
} 
foreach ($dir_list as $dir) { 
    foreach (glob($dir."*.php") as $filename) 
     require_once $filename; 
} 

Не забывайте, что он будет использовать алфавитный порядок, чтобы включить файлы.

+1

«Не забывайте, что он будет использовать буквенный порядок« Неправильно ... »Записи возвращаются в том порядке, в котором они хранятся в файловой системе.' - http://php.net/manual/en/function. readdir.php – NemoStein

+1

Это может не сработать, если файлы зависят друг от друга и порядок не соответствует зависимости –

11

Как сделать это в 2017 году:

spl_autoload_register(function ($class_name) { 
    $CLASSES_DIR = __DIR__ . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR; // or whatever your directory is 
    $file = $CLASSES_DIR . $class_name . '.php'; 
    if(file_exists($file)) include $file; // only include if file exists, otherwise we might enter some conflicts with other pieces of code which are also using the spl_autoload_register function 
}); 

Рекомендуется PHP документации здесь: Autoloading classes

1

Если есть НЕТ зависимостей между файлами ... здесь рекурсивная функция include_once ALL php files in ВСЕ ПОДПИСКА:

$paths = array(); 

function include_recursive($path, $debug=false){ 
    foreach(glob("$path/*") as $filename){   
    if(strpos($filename, '.php') !== FALSE){ 
     # php files: 
     include_once $filename; 
     if($debug) echo "<!-- included: $filename -->\n"; 
    } else { # dirs 
     $paths[] = $filename; 
    } 
    } 
    # Time to process the dirs: 
    for($i=count($paths)-1; $i>0; $i--){ 
    $path = $paths[$i]; 
    unset($paths[$i]); 
    include_recursive($path); 
    } 
} 

include_recursive("tree_to_include"); 
# or... to view debug in page source: 
include_recursive("tree_to_include", 'debug'); 
Смежные вопросы