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.

occhiso
sumber

Jawaban:

437
foreach (glob("classes/*.php") as $filename)
{
    include $filename;
}
Karsten
sumber
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;
        }
    }
}
Marius
sumber
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

Larangan
sumber
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

Jika Anda menggunakan php 5, Anda mungkin ingin menggunakan autoload .

SorinV
sumber
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");
foobar
sumber
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

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

Anda dapat menggunakan set_include_path :

set_include_path('classes/');

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

albanx
sumber
13
Itu tidak termasuk secara otomatis semua file php dalam direktori, hanya memungkinkan untuk menghilangkan classes/ketika menggunakan include/require
Gherman
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.

Matthieu Chavigny
sumber
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.

Scott Dawson
sumber
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');
Sergio Abreu
sumber
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"); 
}
Tuan Genesis
sumber
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).

Stiropor
sumber
-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.

bimal
sumber
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