निर्देशिका से सभी PHP फ़ाइलों को कैसे शामिल करें ()?


230

PHP में क्या मैं लिपियों की एक निर्देशिका शामिल कर सकता हूँ?

इसके बजाय:

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

क्या कुछ ऐसा है:

include('classes/*');

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

जवाबों:


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

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

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

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

20
बेस क्लास को विस्तारित करने वाली कक्षाओं की आवश्यकता होने पर यह तरीका अच्छा नहीं है: उदाहरण के लिए यदि BaseClass ने AFTER ExtendedClass के एरे में दिखाया तो यह काम नहीं करेगा!
कार्मेगेडन

2
@ हंसते हुए get_include_path()अभी भी ऑटो लोडिंग ऑर्डर निर्धारित नहीं कर सकता (बेस क्लास को लोड किए गए क्लास के बाद, त्रुटियों के कारण लोड किया जा सकता है)
रैप्टर

50

यह तरीका है कि मैं 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;
        }
    }
}

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

1
ग्लोबल्स का उपयोग करना एक समाधान नहीं है
पीटर

मैं संगीतकार ( getcomposer.org ) का उपयोग करने की सलाह दूंगा यदि आपको यहां दिखाए गए एक स्वनिर्धारित ऑटोलॉडिंग समाधान के बजाय ऑटोलडिंग की आवश्यकता हो।
केल्ट

32

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

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

$user = new User();

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


1
जब यह पोस्ट किया गया था, तो यह एक ठोस जवाब था, क्योंकि PHP7.2.0 के रूप में इस विधि को पदावनत किया गया है और इसका उपयोग नहीं किया जाना चाहिए। इसके बजाय, spl_autoload_register का उपयोग करें ।
फ्रोजनजकलोप

1
यह एक बेहतर तरीका है यदि उद्देश्य CLASSES को शामिल करना है।
ब्लैकबम

20

यदि आप php 5 का उपयोग कर रहे हैं, तो आप इसके बजाय ऑटोलॉड का उपयोग करना चाह सकते हैं ।


20

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

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

include_all_php("my_classes");

12
यह स्वीकृत उत्तर के लिए प्रासंगिक कुछ भी नहीं जोड़ता है।
मोपेट

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

19

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

PHP प्रलेखन द्वारा अनुशंसित यहाँ: ऑटोलॉडिंग कक्षाएं


यह एक सवाल का जवाब नहीं देता है, क्योंकि autoloadखेल में केवल तभी आएगा जब कोई व्यक्ति कक्षा की वस्तु बनाने के लिए प्रयास करता है जो अभी तक लोड नहीं किया गया था।
द गॉडफादर

9

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

set_include_path('classes/');

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


13
यह निर्देशिका में स्वचालित रूप से सभी php-files को शामिल नहीं करता है, बस classes/का उपयोग करते समय चूक करने में सक्षम बनाता है include/require
Gherman

1

यदि आप सभी को एक निर्देशिका और उसकी उपनिर्देशिकाओं में शामिल करना चाहते हैं:

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

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


3
"यह मत भूलो कि यह वर्णनात्मक आदेश का उपयोग करेगा" गलत ... The entries are returned in the order in which they are stored by the filesystem.- php.net/manual/en/function.readdir.php
निमोसेटिन

1
यदि फाइलें एक-दूसरे पर निर्भर हैं और आदेश निर्भरता से मेल नहीं खाता है तो यह काम नहीं कर सकता है
अमानुएल नेगा

1

यदि आपकी कक्षा को एक बार शामिल करने के लिए कक्षाओं का एक गुच्छा शामिल करना है, जिसका आप उपयोग कर सकते हैं:

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

इस तरह आप केवल क्लास वाली php फाइल पर क्लास को परिभाषित कर सकते हैं और पूरी सूची नहीं $thisclass = new thisclass();

कितनी अच्छी तरह से यह सभी फ़ाइलों को संभालता है? मुझे यकीन नहीं है कि इसके साथ थोड़ी गति में कमी हो सकती है।


1

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

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

कृपया अपने कोड में कुछ और स्पष्टीकरण जोड़ें, विशेष रूप से इस प्रश्न के पहले से ही बहुत सारे उत्तर हैं
निको हसे

0

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


-1

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

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


2
"चर स्कोप खोना" से आपका क्या मतलब है?
पीयूष

3
आपको हमेशा एक फ़ंक्शन का उपयोग करना चाहिए यदि आप पुन: उपयोग करने जा रहे हैं, या बस कोड को "स्व-दस्तावेजीकरण" बनाने के लिए। "ग्लोबल स्कोप" का मुद्दा मुझे लगता है कि एक रेड-हेरिंग है। जब भी आप "वैश्विक स्कोप" का उपयोग कर रहे हैं, तो आप इससे बचने के लिए अपने कोड को दोबारा लिखने के बारे में गंभीरता से सोचना चाहते हैं।
स्टेव एस्कुरा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.