2011-09-15 9 views
8

हाय मैं गिटार chords के लिए एक पुस्तकालय विकसित कर रहा हूँ। पुस्तकालय पर कुछ फ़ाइलों में मैं कुछ इस तरह है:एक PHP पुस्तकालय बनाना, इसे कैसे स्वतंत्र बनाना है?

require_once "lib/GuitarChord.php"; 
require_once "lib/Chord.php"; 
require_once "lib/Key.php"; 
require_once "lib/Tuning.php"; 

मैं इस पुस्तकालय बनाने के लिए कैसे तो यह पता करने के लिए जहां अन्य पुस्तकालय फ़ाइलें हैं की जरूरत नहीं है सकते हैं?

इस तरह एक व्यक्ति किसी भी निर्देशिका में पुस्तकालय फ़ाइलें हो सकता था?

संपादित करें: दूसरा प्रश्न हटा दिया गया।

+2

एक समय में एक प्रश्न पूछना बेहतर है, और उन्हें यथासंभव विशिष्ट रखने की कोशिश करें। – Jon

+0

क्या इस पुस्तकालय को देखने का कोई मौका है? क्या यह गिटहब पर है? – Gordon

उत्तर

7

में देख सभी स्थानों जहां इन कक्षाओं में हो सकता है के लिए autoloaders बनाएं लायक है।

उदाहरण के लिए:

//AUTOLOADER 
function class_autoloader($class) { 

    // presumes classes are in './classes' 
    $folders = array(
    './', './../', './../../' 
    ); 
    $directories = array(
    'classes','lib', '' 
    ); 
    $dir = dirname(__FILE__); 
    $theClass = '/' . $folderedClass . '.php'; 


    foreach($folders as $folder){ 
     foreach($directories as $directory){ 
      $theInclude = $dir.$folder.$directory.$theClass; 

      if (file_exists($theInclude) && include_once($theInclude)) { 
       return TRUE; 
      } 
     } 
    } 

    trigger_error("The class '$class' or the file '$theClass' failed to spl_autoload ", E_USER_WARNING); 

    return FALSE; 
} 

spl_autoload_register('class_autoloader'); 

तो अगर आप Chord कक्षा लोड करना चाहते हैं और आप इसे अपने lib फ़ोल्डर में है पता है, autoloader जब आप ऐसा करेंगे आप के लिए काम करेंगे:

new Chord(); 

आप spl_autoload_register

+0

क्या कोई तरीका है कि मैं पुस्तकालय को यह जान सकता हूं कि अन्य फाइलें स्वचालित रूप से कहां स्थित हैं? अन्य फाइलें हमेशा पुस्तकालय प्रविष्टि बिंदु के समान निर्देशिका पर होंगी। पूर्व के लिए "lib/glib.php" की आवश्यकता है; ग्लिब प्रवेश बिंदु है। अन्य सभी फ़ाइलों को lib/पर माना जाता है। क्या यह संभव है? – carlosdubusm

+0

@carlos - यह 'स्वचालित रूप से' कहा जाता है जिसे 'ऑटोलोड' कहा जाता है – Neal

1

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

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

+0

पहला बंद - मैंने डाउनवोट नहीं किया, दूसरा - इसके साथ मेरा मुद्दा यह है कि आप उन कक्षाओं को लोड कर सकते हैं जिन्हें आपको ** ** की आवश्यकता नहीं है ** यदि आप एक ** बड़ी ** कक्षा फ़ाइल बनाते हैं, तो छोटी फ़ाइलों के साथ बेहतर हो सकता है और एक ऑटोलोडर – Neal

1

कहीं आप, फ़ोल्डर का नाम शामिल करने के लिए यदि आप एक फ़ाइल में अपने सभी वर्ग शामिल नहीं करना चाहते हैं जा रहे हैं। आप इसे कहीं कर सकते हैं उपयोगकर्ता केवल हालांकि, एक बार स्थापित करने के लिए है कि:

$lib_folder = "lib"; 

require_once $lib_folder . "/GuitarChord.php"; 
require_once $lib_folder . "/Chord.php"; 
require_once $lib_folder . "/Key.php"; 
require_once $lib_folder . "/Tuning.php"; 

डेटाबेस के विभिन्न प्रकार से निपटने के लिए के रूप में, आप $ db_type की तरह एक और सेटिंग है, जो उपयोगकर्ता को या तो "mysql" सेट कर सकते हैं, " फ़ाइल "," एक्सएमएल ", आदि। और जहां आप डीबी पर कॉल करते हैं, यह देखने के लिए स्विच स्टेटमेंट का उपयोग करें कि वे किस डेटाबेस विधि का उपयोग कर रहे हैं और तदनुसार अपनी कॉल बदल दें।

संपादित करें: यह भी PHP's __autoload feature

0

साथ कई अलग अलग autoloader कॉलबैक संलग्न कर सकते हैं आपकरके देख सकते हैं।

0

आप namespaces और autoloaders की जांच करनी चाहिए।

कहते हैं कि तुम 'GuitarChords' नाम स्थान के भीतर अपने सभी वर्गों है की सुविधा देता है - तो आप केवल बना सकते हैं autoload समारोह कुछ निम्न के समान (यह मानते हुए फ़ाइल, जहाँ आप अपने autoloader रजिस्टर "lib" की पेरेंट निर्देशिका में है):

spl_autoload_register(function($class){ 
     $namespace = explode('\\', $class, 2); 
      if ($namespace[0] === 'GuitarChords' && isset($namespace[1])) { 
      include(__DIR__.DIRECTORY_SEPARATOR.'lib'.DIRECTORY_SEPARATOR.$namespace[1].'.class.php'); 
      } 
    }); 

मुझे लगता है कि यह विशेष रूप से हर पुस्तकालय सेट/नाम स्थान के लिए एक autoload समारोह रजिस्टर करने के लिए बेहतर है। निर्देशिकाओं पर इटरेटिंग और include_once, file_exists आदि का उपयोग करके आपके सिस्टम की जटिलता के आधार पर कुछ बुरा आईओ ओवरहेड उत्पन्न हो सकता है।

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