如何包括()所有PHP文件从一个目录?

在PHP中,我可以包括一个脚本目录吗?

例如:

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

比如:

include('classes/*');

似乎找不到一个好方法来为一个特定的类包含大约10个子类的集合。

267361 次浏览

我建议你使用readdir ()函数,然后循环并包含文件(参见该页的第一个例子)。

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

下面是我从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;
}
}
}

这只是卡斯顿代码的修改

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


include_all_php("my_classes");

你可以使用set_include_path:

set_include_path('classes/');

http://php.net/manual/en/function.set-include-path.php < a href = " http://php.net/manual/en/function.set-include-path.php " > < / >

不要编写函数()在目录中包含文件。你可能会失去变量作用域,可能不得不使用“global”。只需循环文件。

另外,当一个包含的文件的类名将扩展到另一个文件中定义的另一个类时,您可能会遇到困难——这个文件还没有包含。所以,要小心。

我知道这是一个老帖子,但是…不要包括你的课程……而是使用__autoload

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


$user = new User();

然后,每当你调用一个尚未包含的新类时,php将自动触发__autoload并为你包含它

如果你想包含一堆类,而不必一次定义每个类,你可以使用:

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

这样你就可以在包含类的php文件上定义类,而不是整个$thisclass = new thisclass();列表

至于它处理所有文件的效果如何?我不确定这可能会有轻微的速度下降。

如果你想包含所有在一个目录和它的子目录:

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

不要忘记,它将使用字母顺序来包括您的文件。

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文档推荐:半自动的类

如果文件之间存在没有依赖关系…下面是一个递归函数来包含所有子dirs中的include_once所有php文件:

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

尝试使用库来实现这个目的。

这是一个简单的实现相同的想法,我已经建立。 它包括指定的目录和子目录文件

< >强IncludeAll < / >强

通过终端[cmd]安装

composer install php_modules/include-all

或者将其设置为包中的依赖项。json文件

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

使用

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


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

这是一个比较晚的答案,涉及到PHP >7.2到PHP 8。

OP在标题中没有询问职业,但从他的措辞中我们可以看出他想要包括职业。(顺便说一句。此方法也适用于名称空间)。

通过使用require_once你用一条毛巾杀死了三只蚊子。

  • 首先,如果文件不存在,您将在日志文件中以错误消息的形式得到有意义的重击。这在调试时非常有用。(include只会生成一个可能不那么详细的警告)
  • 只包含包含类的文件
  • 您可以避免加载一个类两次
spl_autoload_register( function ($class_name) {
require_once  '/var/www/homepage/classes/' . $class_name . '.class.php';
} );


这将适用于类

new class_name;

或名称空间。如……

use homepage\classes\class_name;

答案是从另一个问题转过来的。包含关于使用辅助函数的限制的附加信息,以及用于加载包含文件中的所有变量的辅助函数。

没有本地的“include all from folder”;在PHP中。然而,实现起来并不复杂。你可以glob .php文件的路径,并在循环中包含这些文件:

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

在这个答案中,我使用include_once来包含文件。如有必要,请随意更改为includerequirerequire_once

你可以把它变成一个简单的帮助函数:

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

如果你的文件定义的类、函数、常量等是作用域独立的,这将按照预期工作。然而,如果你的文件有变量,你必须“收集”;get_defined_vars()并从函数中返回它们。否则,他们会“迷路”;导入到函数范围中,而不是导入到原始范围中。

如果需要从函数中包含的文件导入变量,你可以:

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

此函数可以与import_folder结合使用,它将返回包含包含文件中定义的所有变量的数组。如果你想从多个文件中加载变量,你可以:

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

根据您的偏好(根据需要注释/取消注释),上面的方法将包含的文件中定义的所有变量作为一个数组返回,或者按定义它们的文件分组。

最后要注意的是:如果您所需要做的就是加载类,则使用spl_autoload_register根据需要自动加载它们是个好主意。使用自动加载器假设您已经构造了文件系统,并且一致地命名了类和名称空间。