Bagaimana cara memasukkan () semua file PHP dari direktori?


230

Dalam PHP, bisakah saya memasukkan direktori skrip?

yaitu Alih-alih:

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

apakah ada sesuatu seperti:

include('classes/*');

Tampaknya tidak dapat menemukan cara yang baik untuk memasukkan koleksi sekitar 10 sub-kelas untuk kelas tertentu.

Jawaban:


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

4
Saya pikir akan ada cara mencari yang lebih bersih menggunakan include (). Tapi ini akan baik-baik saja. Terimakasih semuanya.
occhiso

5
Saya akan membangun sistem modul yang tepat dengan file konfigurasi, tapi itu hanya karena saya merasa jauh lebih fleksibel daripada hanya memasukkan semuanya . :-)
staticsan

3
Perhatian, hanya berfungsi untuk memasukkan file dalam direktori saat ini. Mungkin saja untuk beralih melalui get_include_path (), tapi ini membosankan dengan cepat.
nalply

20
Metode ini tidak baik ketika membutuhkan kelas yang memperluas kelas dasar: misalnya jika BaseClass muncul dalam array SETELAH ExtendedClass, itu tidak akan berhasil!
Carmageddon

2
@nalply get_include_path()masih tidak dapat secara otomatis menentukan urutan pemuatan (kelas dasar dapat dimuat SETELAH kelas diperluas, menghasilkan kesalahan)
Raptor

50

Inilah cara saya memasukkan banyak kelas dari beberapa folder di PHP 5. Ini hanya akan berfungsi jika Anda memiliki kelas.

/*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
Autoload tidak relevan karena pertanyaan ini adalah tentang memasukkan segala sesuatu dalam direktori - biasanya ini akan berada di direktori yang berbeda: misalnya DataClass didefinisikan dalam direktori BE dan BL.class.php didefinisikan dalam direktori BL.
Carmageddon

1
Menggunakan global bukanlah solusi
Peter

Saya akan menyarankan menggunakan komposer ( getcomposer.org ) jika Anda memerlukan autoloading alih-alih solusi autoloading khusus seperti apa yang ditampilkan di sini.
Kelt

32

Saya menyadari ini adalah posting yang lebih lama TETAPI ... JANGAN TERMASUK KELAS ANDA ... alih-alih gunakan __autoload

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

$user = new User();

Maka setiap kali Anda memanggil kelas baru yang belum dimasukkan, php akan otomatis mem-boot __autol dan memasukkannya untuk Anda


1
Meskipun ini adalah jawaban yang solid ketika diposkan, pada PHP7.2.0 metode ini sudah usang dan tidak boleh digunakan. Sebagai gantinya, gunakan spl_autoload_register .
frozenjakalope

1
Ini adalah jawaban yang jauh lebih baik jika tujuannya adalah untuk memasukkan CLASSES.
Blackbam


20

ini hanya modifikasi dari kode Karsten

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

include_all_php("my_classes");

12
Ini tidak menambahkan apa pun yang relevan dengan jawaban yang diterima.
moopet

terima kasih ini adalah satu-satunya kode yang benar-benar berfungsi karena suatu alasan.
Joseph Astrahan

19

Cara melakukan ini di 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
} );

Direkomendasikan oleh dokumentasi PHP di sini: Kelas autoloading


Ini tidak menjawab pertanyaan, karena autoloadakan ikut bermain hanya ketika seseorang mencoba yaitu untuk membuat objek dari kelas yang belum dimuat.
The Godfather


1

Jika Anda ingin memasukkan semua dalam direktori DAN subdirektori-nya:

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

Jangan lupa bahwa itu akan menggunakan urutan alfabet untuk memasukkan file Anda.


3
"Jangan lupa bahwa itu akan menggunakan urutan abjad" Salah ... The entries are returned in the order in which they are stored by the filesystem.- php.net/manual/en/function.readdir.php
NemoStein

1
Ini mungkin tidak berfungsi jika file-file tersebut saling bergantung dan urutannya tidak sesuai dengan ketergantungan
Amanuel Nega

1

Jika Anda ingin memasukkan banyak kelas tanpa harus mendefinisikan masing-masing kelas sekaligus, Anda dapat menggunakan:

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

Dengan cara ini Anda bisa mendefinisikan kelas pada file php yang berisi kelas dan bukan seluruh daftar $thisclass = new thisclass();

Adapun seberapa baik ia menangani semua file? Saya tidak yakin mungkin ada sedikit penurunan kecepatan dengan ini.


1

Jika TIDAK ada ketergantungan antar file ... berikut adalah fungsi rekursif untuk memasukkan SEMUA file php di SEMUA subdirektori:

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

Silakan tambahkan beberapa penjelasan lebih lanjut ke kode Anda, terutama karena pertanyaan ini sudah memiliki banyak jawaban yang tervotifikasi
Nico Haase

0

Saya sarankan Anda menggunakan fungsi readdir () dan kemudian loop dan sertakan file (lihat contoh 1 pada halaman itu).


-1

Jangan menulis fungsi () untuk memasukkan file dalam direktori. Anda mungkin kehilangan lingkup variabel, dan mungkin harus menggunakan "global". Hanya loop pada file.

Selain itu, Anda mungkin mengalami kesulitan ketika file yang disertakan memiliki nama kelas yang akan diperluas ke kelas lain yang ditentukan dalam file lain - yang belum termasuk. Jadi, berhati-hatilah.


2
Apa yang Anda maksud dengan "kehilangan lingkup variabel"?
piyush

3
Anda harus selalu menggunakan fungsi jika Anda akan menggunakan kembali, atau hanya untuk membuat kode lebih "mendokumentasikan diri sendiri". Masalah "ruang lingkup global" saya pikir adalah ikan haring merah. Setiap kali Anda menggunakan "ruang lingkup global" Anda ingin berpikir serius tentang menulis ulang kode Anda untuk menghindarinya.
Stave Escura
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.