Làm thế nào để bao gồm () tất cả các tệp PHP từ một thư mục?


230

Trong PHP tôi có thể bao gồm một thư mục của các kịch bản?

tức là thay vì:

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

có cái gì đó như:

include('classes/*');

Dường như không thể tìm thấy một cách hay bao gồm một bộ sưu tập khoảng 10 lớp con cho một lớp cụ thể.

Câu trả lời:


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

4
Tôi nghĩ rằng sẽ có một cách tìm kiếm sạch hơn bằng cách sử dụng bao gồm (). Nhưng điều này sẽ làm tốt. Cảm ơn mọi người.
occhiso

5
Tôi sẽ xây dựng một hệ thống mô-đun phù hợp với một tệp cấu hình, nhưng đó chỉ là vì tôi thấy nó linh hoạt hơn nhiều so với việc bao gồm mọi thứ . :-)
staticsan

3
Chú ý, chỉ hoạt động để bao gồm các tập tin trong thư mục hiện tại. Có thể lặp lại thông qua get_include_path (), nhưng điều này nhanh chóng trở nên tẻ nhạt.
nalply

20
Phương thức này không tốt khi yêu cầu các lớp đang mở rộng một lớp cơ sở: ví dụ: nếu BaseClass xuất hiện trong mảng SAU ExtendedClass, nó sẽ không hoạt động!
Carmageddon

2
@nalply get_include_path()vẫn không thể tự động xác định thứ tự tải (lớp cơ sở có thể được tải SAU lớp mở rộng, dẫn đến lỗi)
Raptor

50

Đây là cách tôi bao gồm rất nhiều lớp từ một số thư mục trong PHP 5. Điều này sẽ chỉ hoạt động nếu bạn có các lớp mặc dù.

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

3
Tự động tải không liên quan vì câu hỏi này là về việc bao gồm mọi thứ trong một thư mục - thông thường câu hỏi này sẽ nằm trong các thư mục khác nhau: ví dụ: DataClass được định nghĩa trong thư mục BE và BL. Class.php được xác định trong thư mục BL.
Carmageddon

1
Sử dụng toàn cầu không phải là một giải pháp
Peter

Tôi sẽ khuyên bạn nên sử dụng trình soạn thảo ( getcomposer.org ) nếu bạn cần tự động tải thay vì giải pháp tự động tải tùy chỉnh như những gì được hiển thị ở đây.
Kelt

32

Tôi nhận ra đây là một bài viết cũ hơn NHƯNG ... ĐỪNG BAO GỒM LỚP HỌC CỦA BẠN ... thay vào đó hãy sử dụng __autoload

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

$user = new User();

Sau đó, bất cứ khi nào bạn gọi một lớp mới chưa được bao gồm, php sẽ tự động kích hoạt __autoload và bao gồm nó cho bạn


1
Mặc dù đây là một câu trả lời chắc chắn khi nó được đăng, nhưng kể từ PHP7.2.0, phương pháp này đã không được chấp nhận và không nên sử dụng. Thay vào đó, sử dụng spl_autoload_register .
Frozenjakalope

1
Đây là một cách trả lời tốt hơn nếu mục đích là bao gồm LỚP.
Blackbam


20

đây chỉ là một sửa đổi mã của Karsten

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

include_all_php("my_classes");

12
Điều này không thêm bất cứ điều gì liên quan đến câu trả lời được chấp nhận.
moopet

cảm ơn đây là mã duy nhất thực sự hoạt động vì một số lý do.
Joseph Astrahan

19

Cách làm điều này trong năm 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
} );

Được đề xuất bởi tài liệu PHP tại đây: Các lớp tự động tải


Điều này không trả lời một câu hỏi, bởi vì autoloadsẽ chỉ xuất hiện khi ai đó cố gắng tạo đối tượng của lớp chưa được tải.
Bố già


1

Nếu bạn muốn bao gồm tất cả trong một thư mục VÀ thư mục con của nó:

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

Đừng quên rằng nó sẽ sử dụng thứ tự chữ cái để bao gồm các tệp của bạn.


3
"Đừng quên rằng nó sẽ sử dụng theo thứ tự alphabetic" Wrong ... The entries are returned in the order in which they are stored by the filesystem.- php.net/manual/en/function.readdir.php
NemoStein

1
Điều này có thể không hoạt động nếu các tệp phụ thuộc lẫn nhau và thứ tự không khớp với sự phụ thuộc
Amanuel Nega

1

Nếu bạn muốn bao gồm một loạt các lớp mà không phải xác định từng lớp một, bạn có thể sử dụng:

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

Bằng cách này, bạn chỉ có thể định nghĩa lớp trên tệp php chứa lớp chứ không phải toàn bộ danh sách $thisclass = new thisclass();

Làm thế nào tốt nó xử lý tất cả các tập tin? Tôi không chắc có thể giảm tốc độ một chút với điều này.


1

Nếu KHÔNG có sự phụ thuộc giữa các tệp ... thì đây là hàm đệ quy để bao gồm tất cả các tệp php trong TẤT CẢ các tệp con:

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

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

Vui lòng thêm một số giải thích cho mã của bạn, đặc biệt là vì câu hỏi này đã có rất nhiều câu trả lời được nêu lên
Nico Haase

0

Tôi đề nghị bạn sử dụng hàm readdir () rồi lặp và bao gồm các tệp (xem ví dụ đầu tiên trên trang đó).


-1

Không viết hàm () để bao gồm các tệp trong một thư mục. Bạn có thể mất phạm vi thay đổi và có thể phải sử dụng "toàn cầu". Chỉ cần lặp trên các tập tin.

Ngoài ra, bạn có thể gặp khó khăn khi một tệp được bao gồm có tên lớp sẽ mở rộng sang lớp khác được xác định trong tệp khác - chưa được bao gồm. Vì vậy, hãy cẩn thận.


2
Bạn có ý nghĩa gì khi "mất phạm vi biến"?
piyush

3
Bạn nên luôn luôn sử dụng một hàm nếu bạn định sử dụng lại, hoặc chỉ đơn giản là làm cho mã trở nên "tự ghi lại" hơn. Vấn đề "phạm vi toàn cầu" tôi nghĩ là cá trích đỏ. Bất cứ lúc nào bạn đang sử dụng "phạm vi toàn cầu", bạn muốn suy nghĩ nghiêm túc về việc viết lại mã của mình để tránh nó.
Stave Escura
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.