2011-12-13 9 views
15

इस बिंदु तक मैंने प्रक्रियात्मक स्टैंडअलोन ऑटोलोडर फ़ंक्शंस का उपयोग किया है और स्वचालित रूप से मेरे (आमतौर पर) नामांकित कक्षाओं को लोड करने के लिए spl_autoload_register() के साथ पंजीकृत किया है। हाल ही में, मैंने देखा है कि लोगों ने कुछ प्रमुख PHP ढांचे के साथ संयोजन के साथ ऑटोलोडर वर्गों के उपयोग का जिक्र किया है।PHP ऑटोलोडर वर्ग बनाम प्रक्रियात्मक autoloader समारोह?

लगभग सभी मेरे कोड ऑब्जेक्ट उन्मुख हैं, लेकिन मुझे वास्तव में इस उदाहरण में एक मूल कार्य पर "Autoloader" श्रेणी का उपयोग करने के फायदे नहीं दिखते हैं। और टेस्टेबिलिटी के मामले में, प्रक्रियाओं के कार्यों को सही तरीके से लोड करने के लिए मेरे परीक्षणों में class_exists() चेक का उपयोग करने के बारे में मुझे बहुत अच्छा लगता है।

तो मेरे सवालों का तीन हैं:

  1. क्या लाभ या सुविधाओं (यदि हो तो) मुझे बोलबाला हो सकता है बातें refactor और autoload वर्ग फ़ाइलों के लिए एक पूर्ण विकसित वस्तु का उपयोग शुरू करने?
  2. क्या मुझे स्पष्ट ओओपी सुविधाओं के बाहर यहां कुछ चमकदार फायदे हैं?
  3. क्या आप प्रक्रियात्मक या कक्षा ऑटोलोडर के लिए कोई मामला बना सकते हैं?

अद्यतन

नीचे एक ठेठ autoload समारोह मैं रोजगार देने के कुछ उदाहरण कोड है। यह मेटाकोड है, इसलिए टाइपो की तलाश न करें। मैं अपनी निर्देशिका संरचनाओं को व्यवस्थित करता हूं ताकि वे नामस्थानों को दर्पण कर सकें। Hypothetical explode_namespaces() फ़ंक्शन सैद्धांतिक रूप से कक्षा में एक स्थिर autoload() विधि के साथ एक स्थैतिक विधि के रूप में शामिल किया जा सकता है, इसलिए यह एक लाभ है। इन अलग-अलग "उपयोगिता" कार्यों को एक वर्ग में विधियों के रूप में संयोजित करने के लिए यह क्लीनर हो सकता है।

function autoload($class_name) 
{ 
    $root = APP_LIBS; // a directory path constant set at config time 

    if ($namespaces = explode_namespaces($class_name)) { 

    $domain = array_shift($namespaces); 
    $root .= "/$domain/"; 

    $class_name = array_pop($namespaces); 
    $directories = array(); 

    foreach ($namespaces as $directory) { 
     $directories[] = $directory; 
    } 
    $root .= implode($directories, '/'); 
    } 

    $file = "$root/$class_name.php"; 
    if (file_exists($file)) { 
    include $file; 
    } 
} 
+0

मैंने आपके प्रश्न से "उत्तर" भाग हटा दिया है क्योंकि यह वास्तव में प्रश्न के लिए अप्रासंगिक है। आपको अपना जवाब जोड़ने पर विचार करना चाहिए, यह संभवतः दूसरों की मदद करेगा :) – James

उत्तर

4

आप विधियों के साथ कार्यों की तुलना कर रहे हैं। यह सिर्फ वाक्य रचनात्मक चीनी है।

जब तक आपके पास नक्शा-आधारित ऑटोलोडर या कोई अंतर्निहित निर्भरता तालिका नहीं है, तो आपको चीजों का ट्रैक रखने के लिए किसी वर्ग-स्तरीय विशेषताओं की आवश्यकता नहीं है (या अन्यथा स्थिर या वैश्विक वर्रों का सहारा ले सकता है)। रनटाइम पुनर्गठन योग्यता अभ्यास में वास्तविक आवश्यकता नहीं है।

आप एक प्रक्रियात्मक ऑटोलोडर प्रोजेक्ट-कॉन्स्टेबलबल बना सकते हैं जो स्थिरांक आदि के साथ कॉन्फ़िगर करने योग्य है। कन्स्ट्रक्टर गुणों को एक विधि कार्यान्वयन के साथ पुन: उपयोग करने के लिए लाभ का महत्वपूर्ण नहीं है। यह केवल थोड़ा अच्छा लग सकता है।

0

प्रीबिल्ट एक का उपयोग करें यदि आप पहले से ही ढांचे के दूसरे बड़े हिस्से का उपयोग करते हैं, अन्यथा यह वास्तव में कोई फर्क नहीं पड़ता।

इसके अलावा, एक ऑटो लोडर का उपयोग करके, पंजीकृत कई नामस्थान/निर्देशिकाओं के साथ स्मृति इतनी कम हो जाएगी, लेकिन यह वास्तव में चिंता का विषय नहीं है।

+0

प्रतिक्रिया के लिए धन्यवाद। मैं कहा ढांचे का उपयोग नहीं करते हैं। मैं आमतौर पर चेरी को विभिन्न रूपरेखाओं से अपनी पसंदीदा विशेषताओं को चुनना पसंद करता हूं और मुझे "आपको ढांचे का उपयोग करना चाहिए" चर्चा नहीं है :) इसके अलावा, मैं वर्तमान में केवल एक ऑटोलोडर का उपयोग कर रहा हूं .. नमूना कोड के साथ प्रश्न अपडेट करने के बारे में । – rdlowrey