How to include() all PHP files from a directory?

PhpInclude

Php Problem Overview


In PHP can I include a directory of scripts?

i.e. Instead of:

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

is there something like:

include('classes/*');

Couldn't seem to find a good way of including a collection of about 10 sub-classes for a particular class.

Php Solutions


Solution 1 - Php

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

Solution 2 - Php

Here is the way I include lots of classes from several folders in PHP 5. This will only work if you have classes though.

/*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;
		}
	}
}

Solution 3 - Php

I realize this is an older post BUT... DON'T INCLUDE YOUR CLASSES... instead use __autoload

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

$user = new User();

Then whenever you call a new class that hasn't been included yet php will auto fire __autoload and include it for you

Solution 4 - Php

this is just a modification of Karsten's code

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

include_all_php("my_classes");

Solution 5 - Php

How to do this in 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
} );

Recommended by PHP documentation here: Autoloading classes

Solution 6 - Php

You can use set_include_path:

set_include_path('classes/');

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

Solution 7 - Php

<?php
//Loading all php files into of functions/ folder 

$folder =   "./functions/"; 
$files = glob($folder."*.php"); // return array files

 foreach($files as $phpFile){   
     require_once("$phpFile"); 
}

Solution 8 - Php

If there are NO dependencies between files... here is a recursive function to include_once ALL php files in ALL subdirs:

$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');

Solution 9 - Php

If your looking to include a bunch of classes without having to define each class at once you can use:

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

This way you can just define the class on the php file containing the class and not a whole list of $thisclass = new thisclass();

As for how well it handles all the files? I'm not sure there might be a slight speed decrease with this.

Solution 10 - Php

If you want include all in a directory AND its subdirectories:

$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;
}

Don't forget that it will use alphabetic order to include your files.

Solution 11 - Php

I suggest you use a readdir() function and then loop and include the files (see the 1st example on that page).

Solution 12 - Php

Try using a library for that purpose.

That is a simple implementation for the same idea I have build. It include the specified directory and subdirectories files.

IncludeAll

Install it via terminal [cmd]

composer install php_modules/include-all

Or set it as a dependency in the package.json file

{
  "require": {
    "php_modules/include-all": "^1.0.5"
  }
}

Using

$includeAll = requires ('include-all');

$includeAll->includeAll ('./path/to/directory');

Solution 13 - Php

This is a late answer which refers to PHP > 7.2 up to PHP 8.

The OP does not ask about classes in the title, but from his wording we can read that he wants to include classes. (btw. this method also works with namespaces).

By using require_once you kill three mosquitoes with one towel.

  • first, you get a meaningful punch in the form of an error message in your logfile if the file doesn't exist. which is very useful when debugging.( include would just generate a warning that might not be that detailed)
  • you include only files that contain classes
  • you avoid loading a class twice
spl_autoload_register( function ($class_name) {
    require_once  '/var/www/homepage/classes/' . $class_name . '.class.php';
} );

this will work with classes

new class_name;

or namespaces. e.g. ...

use homepage\classes\class_name;

Solution 14 - Php

Answer ported over from another question. Includes additional info on the limits of using a helper function, along with a helper function for loading all variables in included files.

There is no native "include all from folder" in PHP. However, it's not very complicated to accomplish. You can glob the path for .php files and include the files in a loop:

foreach (glob("test/*.php") as $file) {
	include_once $file;
}

In this answer, I'm using include_once for including the files. Please feel free to change that to include, require or require_once as necessary.

You can turn this into a simple helper function:

function import_folder(string $dirname) {
	foreach (glob("{$dirname}/*.php") as $file) {
		include_once $file;
	}
}

If your files define classes, functions, constants etc. that are scope-independent, this will work as expected. However, if your file has variables, you have to "collect" them with get_defined_vars() and return them from the function. Otherwise, they'd be "lost" into the function scope, instead of being imported into the original scope.

If you need to import variables from files included within a function, you can:

function load_vars(string $path): array {
	include_once $path;
	unset($path);
	return get_defined_vars();
}

This function, which you can combine with the import_folder, will return an array with all variables defined in the included file. If you want to load variables from multiple files, you can:

function import_folder_vars(string $dirname): array {
	$vars = [];
    foreach (glob("{$dirname}/*.php") as $file) {

		// If you want to combine them into one array:
		$vars = array_merge($vars, load_vars($file)); 

		// If you want to group them by file:
        // $vars[$file] = load_vars($file);
    }
	return $vars;
}

The above would, depending on your preference (comment/uncomment as necessary), return all variables defined in included files as a single array, or grouped by the files they were defined in.

On a final note: If all you need to do is load classes, it's a good idea to instead have them autoloaded on demand using spl_autoload_register. Using an autoloader assumes that you have structured your filesystem and named your classes and namespaces consistently.

Solution 15 - Php

Do no write a function() to include files in a directory. You may lose the variable scopes, and may have to use "global". Just loop on the files.

Also, you may run into difficulties when an included file has a class name that will extend to the other class defined in the other file - which is not yet included. So, be careful.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionocchisoView Question on Stackoverflow
Solution 1 - PhpKarstenView Answer on Stackoverflow
Solution 2 - PhpMariusView Answer on Stackoverflow
Solution 3 - PhpBanningView Answer on Stackoverflow
Solution 4 - PhpfoobarView Answer on Stackoverflow
Solution 5 - PhpSorin CView Answer on Stackoverflow
Solution 6 - PhpalbanxView Answer on Stackoverflow
Solution 7 - PhpMr GenesisView Answer on Stackoverflow
Solution 8 - PhpSergio AbreuView Answer on Stackoverflow
Solution 9 - PhpScott DawsonView Answer on Stackoverflow
Solution 10 - PhpMatthieu ChavignyView Answer on Stackoverflow
Solution 11 - PhpStiroporView Answer on Stackoverflow
Solution 12 - PhpAgostinho Sambo LopesView Answer on Stackoverflow
Solution 13 - PhpMax MusterView Answer on Stackoverflow
Solution 14 - PhpMarkus AOView Answer on Stackoverflow
Solution 15 - PhpbimalView Answer on Stackoverflow