2009-03-01 17 views
190

PHP में बहुत तेज़ n00b सवाल, मैं स्क्रिप्ट की निर्देशिका शामिल कर सकता हूं।निर्देशिका से सभी PHP फ़ाइलों को कैसे शामिल करें?

यानी बजाय:

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

वहाँ की तरह कुछ है:

include('classes/*'); 

एक विशेष वर्ग के लिए के बारे में 10 उप-वर्गों के एक संग्रह सहित के लिए एक अच्छा तरीका खोजने के लिए प्रतीत नहीं किया जा सका ।

उत्तर

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

मैंने सोचा कि वहां एक होगा क्लीनर देखने का तरीका शामिल()। लेकिन यह ठीक होगा। सबको धन्यवाद। – occhiso

+5

मैं कॉन्फ़िगरेशन फ़ाइल के साथ एक उचित मॉड्यूल सिस्टम का निर्माण करूंगा, लेकिन ऐसा इसलिए है क्योंकि मुझे बस * सबकुछ * से अधिक लचीला लगता है। :-) – staticsan

+3

ध्यान, केवल वर्तमान निर्देशिका में फ़ाइलों को शामिल करने के लिए काम करता है। Get_include_path() के माध्यम से पुन: प्रयास करना संभव होगा, लेकिन यह जल्दी से थकाऊ हो जाएगा। – nalply

0

मेरा सुझाव है कि आप readdir() फ़ंक्शन का उपयोग करें और फिर लूप करें और फ़ाइलों को शामिल करें (उस पृष्ठ पर पहला उदाहरण देखें)।

18

यदि आप PHP 5 का उपयोग कर रहे हैं तो आप इसके बजाय autoload का उपयोग करना चाहेंगे।

49

यहां मैं 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; 
     } 
    } 
} 
+1

+1 को ऑटोलोड के लिए बदल दूंगा। [ऑटोलोड फ़ंक्शन] (http://php.net/manual/en/function.autoload.php), [ऑटोलोड सुविधा] (http://php.net/manual/en/language.oop5.autoload.php) –

+1

Autoload प्रासंगिक नहीं है क्योंकि यह प्रश्न निर्देशिका में सब कुछ शामिल करने के बारे में था - आमतौर पर यह अलग-अलग निर्देशिकाओं में होगा: उदाहरण के लिए बीएल निर्देशिका में परिभाषित डेटा क्लास और बीएल निर्देशिका में परिभाषित BL.class.php। – Carmageddon

+1

ग्लोबल्स का उपयोग करना समाधान नहीं है – Peter

19

यह सिर्फ कर्स्टन के कोड का एक संशोधन

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

include_all_php("my_classes"); 
+9

यह स्वीकृत उत्तर से प्रासंगिक कुछ भी नहीं जोड़ता है। – moopet

+0

धन्यवाद यह एकमात्र कोड था जो वास्तव में किसी कारण से काम करता था। –

9

आप set_include_path का उपयोग कर सकते है:

set_include_path('classes/'); 

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

+12

इसमें निर्देशिका में स्वचालित रूप से सभी php-files शामिल नहीं हैं, केवल 'include' /' requ' – Gherman

-2

कोई लिखने एक समारोह करो) शामिल करने के लिए (निर्देशिका में फाइलें। आप परिवर्तनीय क्षेत्रों को खो सकते हैं, और "वैश्विक" का उपयोग करना पड़ सकता है। फाइलों पर बस लूप।

इसके अलावा, आप कठिनाइयों में भाग ले सकते हैं जब एक फ़ाइल में एक वर्ग का नाम होता है जो अन्य फ़ाइल में परिभाषित अन्य वर्ग तक विस्तारित होगा - जो अभी तक शामिल नहीं है। तो सावधान रहें।

+1

का उपयोग करते समय 'वर्ग /' को छोड़ने में सक्षम बनाता है "क्या वेरिएबल स्कॉप्स खोएं" से आपका क्या मतलब है? – piyush

+2

यदि आप पुन: उपयोग करने जा रहे हैं, या बस कोड को और अधिक "स्वयं-दस्तावेज़" बनाने के लिए आपको हमेशा एक फ़ंक्शन का उपयोग करना चाहिए। "ग्लोबल स्कोप" का मुद्दा मुझे लगता है कि एक लाल हेरिंग है। जब भी आप "वैश्विक क्षेत्र" का उपयोग कर रहे हों, तो आप इससे बचने के लिए अपने कोड को फिर से लिखने के बारे में गंभीरता से सोचना चाहते हैं। –

+0

दायरे के लिए बहुत अच्छा बिंदु !!! – Nick

26

मुझे पता है यह एक पुराने पोस्ट है, लेकिन ... अपनी कक्षाओं शामिल न करें ... बजाय का उपयोग __autoload

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

$user = new User(); 

तो जब भी आप एक नया वर्ग है कि शामिल नहीं किया गया है अभी तक php इच्छा फोन ऑटो आग __autoload और इसे शामिल करने के लिए आप

0

यदि आपका एक बार आप उपयोग कर सकते हैं पर प्रत्येक वर्ग को परिभाषित करने के बिना वर्गों के एक समूह में शामिल करने के लिए देख:

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

इस तरह से आप कर सकते हैं j ust कक्षा वाले 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; 
} 

मत भूलना कि यह वर्णमाला क्रम का उपयोग करेगा अपनी फ़ाइलें शामिल करने के लिए:

1

आप एक निर्देशिका और उसकी उप में सभी शामिल हैं।

+1

"यह न भूलें कि यह वर्णमाला क्रम का उपयोग करेगा" गलत ... 'प्रविष्टियां उस क्रम में लौटा दी जाती हैं जिसमें वे फाइल सिस्टम द्वारा संग्रहीत होते हैं।' - http://php.net/manual/en/function। readdir.php – NemoStein

+1

यह काम नहीं कर सकता है अगर फाइल एक-दूसरे पर निर्भर हैं और ऑर्डर निर्भरता से मेल नहीं खाता है –

11

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

पीएचपी प्रलेखन यहाँ द्वारा अनुशंसित: Autoloading classes

1

अगर वहाँ कोई निर्भरता फ़ाइलों के बीच ... यहाँ 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'); 
संबंधित मुद्दे

 संबंधित मुद्दे