Bir dizindeki tüm PHP dosyaları nasıl dahil edilir ()?


230

PHP bir betik dizini ekleyebilir miyim?

yani Yerine:

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

gibi bir şey var mı:

include('classes/*');

Belirli bir sınıf için yaklaşık 10 alt sınıftan oluşan bir koleksiyon eklemek için iyi bir yol bulamadık.

Yanıtlar:


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

4
İnclude () kullanarak temiz görünümlü bir yol olacağını düşündüm. Ama bu iyi olacak. Herkese teşekkürler.
occhiso

5
Ben bir yapılandırma dosyası ile uygun bir modül sistemi inşa ediyorum, ama bunun sadece her şeyi dahil olmaktan çok daha esnek buluyorum çünkü . :-)
staticsan

3
Dikkat, yalnızca geçerli dizine dosya eklemek için çalışır. Get_include_path () ile yineleme yapmak mümkün olabilir, ancak bu çabuk yorulur.
nalply

20
Bir temel sınıfı genişleten sınıflar gerektiğinde bu yöntem iyi değildir: örn. BaseClass, ExtendedClass'tan SONRA dizisinde görünüyorsa, çalışmaz!
Carmageddon

2
@nalply get_include_path()hala yükleme sırasını otomatik olarak belirleyemiyor (temel sınıf genişletilmiş sınıftan SONRA yüklenebilir, sonuçta oluşan hatalar)
Raptor

50

İşte PHP 5 çeşitli klasörlerden sınıflar çok dahil yoludur. Bu sadece sınıfları olsa çalışır.

/*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
Bu soru bir dizine her şeyi eklemekle ilgili olduğundan, otomatik yükleme ilgili değildir - genellikle bu farklı dizinlerde olur: örneğin BE dizininde tanımlanan DataClass ve BL dizininde tanımlanan BL.class.php.
Carmageddon

1
Globalleri kullanmak bir çözüm değildir
Peter

Burada gösterilenler gibi özelleştirilmiş bir otomatik yükleme çözümü yerine otomatik yüklemeye ihtiyacınız varsa, besteci ( getcomposer.org ) kullanmanızı öneririm .
Kelt

32

Bu eski bir yazı olduğunu anlıyorum AMA ... SINIFLARINIZI DAHİL ETMEYİN ... bunun yerine __autoload kullanın

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

$user = new User();

Sonra henüz dahil edilmemiş yeni bir sınıf aradığınızda php __autoload otomatik ateş ve sizin için dahil


1
Bu yayınlandığı zaman sağlam bir cevap olsa da, PHP7.2.0'dan itibaren bu yöntem kullanımdan kaldırılmıştır ve kullanılmamalıdır. Bunun yerine spl_autoload_register kullanın .
frozenjakalope

1
Amaç SINIFLARI dahil etmekse, bu daha iyi bir cevaptır.
Blackbam


20

bu sadece Karsten kodunun bir modifikasyonu

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

include_all_php("my_classes");

12
Bu, kabul edilen cevapla ilgili hiçbir şey eklemez.
moopet

teşekkürler bu aslında bir nedenle işe yarayan tek kod oldu.
Joseph Astrahan

19

2017'de nasıl yapılır:

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

Burada PHP belgeleri tarafından önerilir: Otomatik yükleme sınıfları


Bu bir soruya cevap vermez, çünkü autoloadsadece birisi henüz yüklenmemiş olan sınıfın nesnesini yaratmaya çalıştığında devreye girecektir.
The Godfather


1

Hepsini bir dizine VE alt dizinlerine dahil etmek istiyorsanız:

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

Dosyalarınızı dahil etmek için alfabetik sıra kullanacağını unutmayın.


3
"Alfabetik düzeni kullanacağını unutmayın" Yanlış ... The entries are returned in the order in which they are stored by the filesystem.- php.net/manual/en/function.readdir.php
NemoStein

1
Dosyalar birbirine bağımlıysa ve sipariş bağımlılığa
uymuyorsa bu işe yaramayabilir

1

Her sınıfı bir kerede tanımlamak zorunda kalmadan bir grup sınıf eklemek istiyorsanız şunları kullanabilirsiniz:

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

Bu şekilde sadece sınıfı içeren php dosyasındaki sınıfı tanımlayabilir, $thisclass = new thisclass();

Tüm dosyaları ne kadar iyi işler? Bununla hafif bir hız düşüşü olabileceğinden emin değilim.


1

Dosyalar arasında HİÇBİR bağımlılık yoksa ... TÜM alt dizinlerde TÜM php dosyalarını dahil etmek için yinelenen bir işlev var:

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

Lütfen kodunuza biraz daha açıklama ekleyin, özellikle de bu soru zaten çok sayıda cevaplandırılmış cevabı olduğu için
Nico Haase

0

Ben bir readdir () işlevi kullanmak ve daha sonra döngü ve dosyaları dahil öneririz ( o sayfada 1. örneğe bakın).


-1

Dizine dosya eklemek için bir işlev () yazmayın. Değişken kapsamlarını kaybedebilirsiniz ve "global" kullanmak zorunda kalabilirsiniz. Sadece dosyalar üzerinde döngü.

Ayrıca, dahil edilen bir dosya, diğer dosyada tanımlanan ve henüz dahil edilmeyen diğer sınıfa genişleyecek bir sınıf adına sahip olduğunda zorluklarla karşılaşabilirsiniz. Yani dikkatli ol.


2
Ne demek "değişken kapsamlarını kaybetmek"?
piyush

3
Tekrar kullanacaksanız veya sadece kodu daha "kendi kendini belgeleyen" hale getirmek için her zaman bir işlev kullanmalısınız. "Küresel kapsam" meselesinin kırmızı bir ringa balığı olduğunu düşünüyorum. "Global kapsam" ı her kullandığınızda, kodunuzu yeniden yazmaktan kaçınmak için ciddi şekilde düşünmek istersiniz.
Stave Escura
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.