2011-06-22 13 views
13

मैंने __autoload फ़ंक्शन आज खोज लिया है और इस फ़ंक्शन के आधिकारिक मैन्युअल पृष्ठ को पढ़ने के बाद एक बिंदु है जो मुझे बिल्कुल नहीं मिला है।__autoload बनाम परिवार शामिल हैं

क्या स्पष्ट रूप से __autoload() का उपयोग और के require_once मान लीजिए के बीच का अंतर है?

क्योंकि यह autoload लग रहा है की आवश्यकता लेकिन मेरे लिए भी शामिल है यह require_once बजाय का उपयोग करने के लिए अब तक बेहतर है करने के नए फैशन तरीका है। इसलिए, __autoload को सभी php फ़ाइलों में परिभाषित किया जाना चाहिए जिसका मतलब है कि सभी मेरे फ़ाइल/requ_once/... आदि को एक फ़ाइल में शामिल करें, इसे main_header.php पर कॉल करें, तो मैं सभी ' मुझे अपनी वेब ऐप फाइलों में करना होगा कोड की एक पंक्ति लिखना है:

<?php require_once('main_header.php'); ?> 

क्या मैं कहीं गलत हूं?

उत्तर

17

मैं दो बातें autoloading के लिए जा रहा देख सकते हैं (जरूरी नहीं __autoload, बजाय और अधिक आधुनिक spl_autoload_register पसंद करते हैं):

  1. आप स्पष्ट रूप से कक्षाओं में शामिल करने की ज़रूरत नहीं है। बेशक, आप अपने उदाहरण के रूप में main_header.php बना सकते हैं, लेकिन फिर अगला आइटम प्रभावी हो जाता है।
  2. यदि आप केवल उनमें से 10 का उपयोग करने जा रहे हैं तो आपको 100 कक्षाएं लोड करने की आवश्यकता नहीं है।

यह भी भी जब एक वर्ग है जो अभी तक परिभाषित नहीं किया गया है, जो चीजों को असीम और अधिक व्यावहारिक बनाता है की एक वस्तु unserializing शुरू हो रहा है कि autoloading बताते लायक है। बेशक इसके लिए unserialize में एक और हुक है (कॉन्फ़िगरेशन सेटिंग unserialize_callback_func), इसलिए ऑटोलोडिंग तकनीकी रूप से आवश्यक नहीं है। यद्यपि यह निश्चित रूप से अच्छा है।

+0

धन्यवाद जॉन, आपका तर्क इसे मार डाला, मैं निश्चित रूप से इस दृष्टिकोण पर आगे बढ़ रहा हूं। – CoolStraw

6

पहले: उपयोग spl_autoload_register() बजाय __autoload()

autoloader कहा जाता है, जब आप एक वर्ग तक पहुँचने का प्रयास, जो मौजूद नहीं है। include() के साथ आप बस एक कक्षा शामिल करते हैं। मुख्य अंतर यह है कि एक ऑटोलोडर का उपयोग करके कक्षा केवल तभी शामिल की जाती है, अगर इसकी वास्तव में आवश्यक/उपयोग की जाती है।

आमतौर पर आप एक फ़ाइल में एक ऑटोलोडर परिभाषित करते हैं और इसे प्रत्येक अनुरोध पर शामिल करते हैं। यदि आप बूटस्ट्रैपिंग का उपयोग करते हैं (अर्थ: एक फ़ाइल, जो प्रत्येक अनुरोध को पकड़ती है और इसे उचित लक्ष्य पर रीडायरेक्ट करती है) केवल वहां ऑटोलोडर को परिभाषित करने की आवश्यकता होती है। इसलिए इसे हर फाइल में परिभाषित करने की आवश्यकता नहीं है।

+0

अब मैं बूटस्ट्रैपिंग (जो कि मैं हालांकि का बड़ा प्रशंसक नहीं हूं) और यह __autoload सामान के बीच का लिंक बेहतर समझता हूं। धन्यवाद! – CoolStraw

5

आटोलोडर आलसी प्रारंभिकरण के लिए उपयोग किया जाता है। यह एमवीसी आर्किटेक्चर के साथ सबसे प्रभावी है, न कि उन वेबसाइटों के साथ जिनमें फ़ाइल और यहां एक फ़ाइल शामिल है और प्रत्येक फ़ाइल में डीबी कनेक्शन स्ट्रिंग को परिभाषित करें (जो भयानक है)।

autoload का उपयोग MVC ढांचे संसाधनों की बचत होती है और प्रतिरूपकता के लिए एक बहुत लाता है के साथ। चूंकि आपको कक्षाओं के साथ फाइलों को शामिल करने की आवश्यकता नहीं है, इसलिए आप वर्तमान में उस नियंत्रक में आवश्यक कक्षा को तुरंत चालू कर सकते हैं।

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

+0

मैं ओओपी का बहुत उपयोग करता हूं (मेरे वेबएप अब 90% ओओपी हैं) तो मुझे लगता है कि यह निश्चित रूप से मेरे लिए है :)। धन्यवाद माइकल :) – CoolStraw

2

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

यह समझ में आता है कि यदि आप कक्षाओं के साथ काम करते हैं और आप एक केंद्रीय स्थान पर फ़ाइलों की आवश्यकता होती है, तो अलग-अलग फाइलों में इसके बजाय एक बिंदु।

लेकिन यदि आप इसका उपयोग कर रहे हैं और मेनू और पाद लेख के साथ वेबसाइट बनाने की आवश्यकता है, तो यह समझ में नहीं आता है। Autoload इस के लिए काम नहीं करता है:

<html> 
    <head><title>Reciepes collection - My Homepage</title></head> 
    <body> 
<?php include('header.html'); ?> 
<h1>My Reciepes collection</h1> 
<p>Cooking is one of my favorite hobbies .... (</p>....) 
<?php include('footer.html'); ?> 
    </body> 
</html> 

आप का इस्तेमाल कर रही हैं, तो कार्यों को लोड करने की आवश्यकता है, आप या तो autoload उपयोग नहीं कर सकते।

इसलिए केवल इसलिए कि ऑटोलोड कुछ अन्य लोगों द्वारा आपके लिए कुछ हद तक प्रशंसनीय दिखता है, इसका मतलब यह नहीं है कि यह आपकी आवश्यकताओं के अनुरूप है।

मैं व्यक्तिगत रूप से उन परियोजनाओं में इसका उपयोग करता हूं जहां मैं कक्षाओं की आवश्यकता का ख्याल रखना नहीं चाहता हूं और जहां मैं मॉड्यूलर निर्देशिका और पुस्तकालय संरचना के भीतर से गतिशील रूप से कक्षाओं को लोड करने में सक्षम होना चाहता हूं।

मैं केवल एक या अधिक ऑटोलोड लोड कार्यान्वयन के लिए spl_autoload_register() का उपयोग करता हूं। PHP में एक ऑटोलोड लोड करने के लिए यह अनुशंसित विधि है क्योंकि इसमें एकाधिक ऑटोलोडर होने की अनुमति है।

+0

आपके व्यापक उत्तर के लिए धन्यवाद! – CoolStraw

+0

आपका स्वागत है। – hakre

2

मुझे लगता है कि यह व्यक्तिगत वरीयता के लिए आता है। मेरे लिए, ऑटोलोड एक सामान्य php प्रकार की चीज है - एक गंदे "जादू-उद्धरण" -साइक हैक, जो केवल अस्तित्व में है क्योंकि वे बैठने के लिए परेशान नहीं हैं और समस्या के लिए एक साफ समाधान कोड करते हैं - इस मामले में, पर्याप्त पैकेजिंग सिस्टम + एक पकड़ने योग्य ClassNotFound अपवाद। जब तक हमें यह तय नहीं हो जाता है, मैं include पर रहूंगा।

+0

उस पर पूरी तरह से आपसे सहमत हैं ... – CoolStraw

0

ऑटोलोड और परिवार के कार्यों में शामिल दोनों की जगह है।

ऑटोलोड एक ओओ आधारित स्क्रिप्ट (अर्थात् कक्षाओं और इंटरफेस) में मॉड्यूल की आलसी लोडिंग के लिए है और जब आप नए या स्थिर रूप से उस वर्ग की विधि को कॉल करते हैं जिसे अभी तक लोड नहीं किया गया है, तो इसका आह्वान किया जाता है। यह उस फ़ंक्शन को चलाने के लिए स्वत: लोड करता है जो लोड करने का प्रयास करता है (आमतौर पर शामिल के माध्यम से) कक्षा में या इंटरफ़ेस। इस दृष्टिकोण का लाभ यह है कि कक्षाएं केवल तभी लोड की जाती हैं जब उनकी आवश्यकता होती है। कोई भी वर्ग जो उपयोग नहीं करता है वह लोड नहीं होता है।

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

प्रत्येक स्क्रिप्ट में स्वत: लोड करने की आवश्यकता वाले प्रत्येक स्क्रिप्ट में एक ऑटोलोड लोड जोड़ने के लिए? इस मामले में आप स्वत: लोड फ़ंक्शन को अपनी फ़ाइल में डालते हैं और इसे स्क्रिप्ट में शामिल करते हैं जिन्हें स्वत: लोड करने की आवश्यकता होती है। :)

2

सभी उत्तरों सही और पर्याप्त से अधिक हैं। मैंने सोचा कि मुझे अपने दो सेंट जोड़ना चाहिए।

पहला, * _once फ़ंक्शन धीमे हैं। उनका उपयोग न करें।

दूसरा, एक ऐप में मैं विकास कर रहा हूं, मेरे पास बहुत से वर्ग हैं जो मैं एक दूसरे पर भरोसा करता हूं और मुझे हमेशा नहीं पता कि किसी पृष्ठ में कौन सी कक्षाएं आवश्यक हैं।

एक main.php पृष्ठ बनाने और सभी कक्षाओं सहित बहुत कुछ शामिल करने के बजाय; स्पष्ट रूप से संसाधनों और समय को बर्बाद करना (शामिल करना और आवश्यकताएं महंगे हैं), मैं उन फ़ाइलों को शामिल करने के लिए ऑटोलोड का उपयोग करता हूं, जब उन्हें पृष्ठ द्वारा आवश्यकता होती है। इसलिए मैं कोड करता हूं और कक्षाएं स्वचालित रूप से जोड़ दी जाती हैं।

यह आपके कोड और निर्देशिका संरचना में भी सुधार करता है क्योंकि आप अपनी कक्षाओं और फ़ाइलों का नामकरण करने में सिस्टम का पालन करते हैं।

बस एक अतिरिक्त। संसाधन उपयोग और गति (आवश्यकताओं के घटते क्रम और गति के बढ़ते क्रम) के संदर्भ में:

Requ_once(); include_once(); आवश्यकता है(); शामिल करें()

सर्वोत्तम और सबसे तेज़ बनाना शामिल है।

+0

धन्यवाद! मुझे अब तक एहसास नहीं हुआ कि ** requ_once ** वह महंगा था, मैंने सोचा कि यह वास्तव में शामिल करने के लिए एक बेहतर प्रकार का प्रतिस्थापन था। मैं ऑटोलोड लोड परिवार में जाकर निश्चित रूप से अपना समावेश उपयोग बदल दूंगा। अन्य महान उत्तरों के बावजूद आपका उत्तर जोड़ने के लिए भी धन्यवाद, आपने उन्हें मूल्य जोड़ा :) – CoolStraw

+0

नहीं,/धन्यवाद/आप। बीटीडब्ल्यू जब आप ऑटोलोड का उपयोग करते हैं, तो आपको * _once() जोड़ी की भी आवश्यकता नहीं होगी क्योंकि आपकी स्क्रिप्ट एक ही कक्षा को दो बार नहीं देखेगी। – frostymarvelous

+0

यह आदमी मिला! फिर से धन्यवाद :) – CoolStraw

0

एक और नोट: इकाई परीक्षण के दौरान शामिल और आवश्यकताएं एक बड़ा दर्द हो सकती हैं।

मुझे नहीं पता कि मुझे कुछ भी शामिल/रोकना चाहिए। test helpers है, जो कुछ उपयोगी चीजें कर सकता है, जैसे बाहर निकलने या मरने से रोकने, लेकिन वे अभी भी शामिल या आवश्यकता नहीं कर सकते हैं।

Mockery लाइब्रेरी recommends सार्वजनिक स्थैतिक तरीकों का नकल करने में सक्षम होने के लिए ऑटोलोडिंग का उपयोग कर।

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