PHP
ऑटोलॉडिंग प्राइमर
खोज…
वाक्य - विन्यास
- की आवश्यकता होती है
- spl_autoload_require
टिप्पणियों
ऑटोलॉडिंग, एक रूपरेखा रणनीति के भाग के रूप में, आपको जो बॉयलरप्लेट कोड लिखना है, उसकी मात्रा को कम करता है।
इनलाइन श्रेणी की परिभाषा, कोई लोडिंग आवश्यक नहीं है
// zoo.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
$animal = new Animal();
$animal->eats('meat');
PHP जानती है कि new Animal
निष्पादित करने से पहले Animal
क्या है, क्योंकि PHP स्रोत फ़ाइलों को ऊपर से नीचे पढ़ता है। लेकिन क्या होगा अगर हम कई जानवरों में नए स्रोत बनाना चाहते हैं, न कि केवल उस स्रोत फ़ाइल में जहां इसे परिभाषित किया गया है? ऐसा करने के लिए, हमें वर्ग परिभाषा को लोड करने की आवश्यकता है।
आवश्यकता के साथ मैनुअल क्लास लोड हो रहा है
// Animal.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
// zoo.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('slop');
// aquarium.php
require 'Animal.php';
$animal = new Animal;
$animal->eats('shrimp');
यहां हमारे पास तीन फाइलें हैं। एक फ़ाइल ("Animal.php") वर्ग को परिभाषित करती है। इस फ़ाइल का वर्ग को परिभाषित करने के अलावा कोई दुष्प्रभाव नहीं है और बड़े करीने से एक जगह "पशु" के बारे में सभी ज्ञान रखता है। यह आसानी से नियंत्रित संस्करण है। यह आसानी से पुन: उपयोग किया जाता है।
मैन्युअल रूप से फ़ाइल की require
द्वारा दो फाइलें "Animal.php" फ़ाइल का उपभोग करती हैं। फिर से, PHP स्रोत फ़ाइलों को ऊपर से नीचे पढ़ता है, इसलिए आवश्यकता होती है और "Animal.php" फ़ाइल को ढूंढता है और new Animal
कॉल करने से पहले Animal
वर्ग की परिभाषा उपलब्ध कराता है।
अब कल्पना कीजिए कि हमारे पास दर्जनों या सैकड़ों मामले थे जहां हम new Animal
प्रदर्शन करना चाहते थे। इसके लिए (दंड-संबंधी) कई की require
, कई require
बयानों की require
है जो कोड के लिए बहुत थकाऊ हों।
ऑटोलाडिंग मैनुअल क्लास डेफिनिशन लोड करने की जगह लेती है
// autoload.php
spl_autoload_register(function ($class) {
require_once "$class.php";
});
// Animal.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
// zoo.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('slop');
// aquarium.php
require 'autoload.php';
$animal = new Animal;
$animal->eats('shrimp');
इसकी तुलना दूसरे उदाहरणों से करें। ध्यान दें कि कैसे require "Animal.php"
की require "autoload.php"
साथ बदल दी गई थी। हम अभी भी रन-टाइम पर एक बाहरी फ़ाइल शामिल कर रहे हैं, लेकिन एक विशिष्ट वर्ग परिभाषा को शामिल करने के बजाय हम तर्क सहित किसी भी वर्ग को शामिल कर सकते हैं। यह अप्रत्यक्ष स्तर है जो हमारे विकास को आसान बनाता है। हर वर्ग को हमारी require
लिए लिखने की बजाय, हम सभी वर्गों के लिए एक require
लिखते हैं। हम 1 require
साथ एन require
को प्रतिस्थापित कर सकते हैं।
जादू spl_autoload_register के साथ होता है। यह PHP फ़ंक्शन एक क्लोजर लेता है और क्लोजर को क्लोजर की एक कतार में जोड़ता है। जब PHP एक ऐसी कक्षा का सामना करता है जिसके लिए इसकी कोई परिभाषा नहीं है, तो PHP कतार में प्रत्येक बंद करने के लिए वर्ग का नाम देता है। यदि क्लोजर कॉल करने के बाद कक्षा मौजूद है, तो PHP अपने पिछले व्यवसाय में लौटता है। यदि पूरी कतार में प्रयास करने के बाद भी कक्षा मौजूद नहीं रहती है, तो PHP "क्लास 'जो भी नहीं मिला" के साथ क्रैश हो जाता है। "
एक ढांचे के समाधान के हिस्से के रूप में ऑटोलोडिंग
// autoload.php
spl_autoload_register(function ($class) {
require_once "$class.php";
});
// Animal.php
class Animal {
public function eats($food) {
echo "Yum, $food!";
}
}
// Ruminant.php
class Ruminant extends Animal {
public function eats($food) {
if ('grass' === $food) {
parent::eats($food);
} else {
echo "Yuck, $food!";
}
}
}
// Cow.php
class Cow extends Ruminant {
}
// pasture.php
require 'autoload.php';
$animal = new Cow;
$animal->eats('grass');
हमारे सामान्य ऑटोलैडर के लिए धन्यवाद, हमारे पास किसी भी वर्ग की पहुंच है जो हमारे ऑटोलैडर नामकरण सम्मेलन का अनुसरण करता है। इस उदाहरण में, हमारा सम्मेलन सरल है: वांछित वर्ग के पास उसी निर्देशिका में एक फ़ाइल होनी चाहिए जिसका नाम वर्ग है और ".php" में समाप्त हो रहा है। ध्यान दें कि कक्षा का नाम फ़ाइल नाम से बिल्कुल मेल खाता है।
ऑटोलॉगिंग के बिना, हमें मैन्युअल रूप से बेस कक्षाओं की require
। यदि हमने जानवरों का एक पूरा चिड़ियाघर बनाया है, तो हमें हजारों बयानों की आवश्यकता होगी जिन्हें एक एकल ऑटोलैडर के साथ आसानी से बदला जा सकता है।
अंतिम विश्लेषण में, PHP ऑटोलॉडिंग आपको कम यांत्रिक कोड लिखने में मदद करने के लिए एक तंत्र है ताकि आप व्यावसायिक समस्याओं को हल करने पर ध्यान केंद्रित कर सकें। आपको बस एक रणनीति को परिभाषित करना है जो वर्ग नाम को फ़ाइल नाम में मैप करता है । आप अपनी स्वयं की ऑटोलॉडिंग रणनीति को रोल कर सकते हैं, जैसा कि यहां किया गया है। या, आप PHP समुदाय द्वारा अपनाई गई किसी भी मानक का उपयोग कर सकते हैं: PSR-0 या PSR-4 । या, आप इन निर्भरताओं को सामान्य रूप से परिभाषित करने और प्रबंधित करने के लिए संगीतकार का उपयोग कर सकते हैं।
संगीतकार के साथ ऑटोलडिंग
संगीतकार एक vendor/autoload.php
फ़ाइल बनाता है।
आप बस इस फ़ाइल को शामिल कर सकते हैं और आपको मुफ्त में ऑटोलडिंग मिलेगी।
require __DIR__ . '/vendor/autoload.php';
यह तृतीय-पक्ष निर्भरता के साथ काम करना बहुत आसान बनाता है।
आप भी अपने लिए एक autoload खंड जोड़कर Autoloader लिए अपने स्वयं के कोड जोड़ सकते हैं composer.json
।
{
"autoload": {
"psr-4": {"YourApplicationNamespace\\": "src/"}
}
}
इस खंड में आप ऑटोलैड मैपिंग को परिभाषित करते हैं। इस उदाहरण में इसका पीएसआर -4 नाम मैपिंग के लिए एक डायरेक्टरी में होता है: /src
डायरेक्टरी आपकी प्रोजेक्ट रूट फ़ोल्डर में उसी स्तर पर रहती है, जिस स्तर पर /vendor
डायरेक्टरी है। एक उदाहरण फ़ाइल नाम src/Foo.php
जिसमें एक YourApplicationNamespace\Foo
वर्ग होगा।
महत्वपूर्ण: ऑटोलैड सेक्शन में नई प्रविष्टियाँ जोड़ने के बाद, आपको नई जानकारी के साथ vendor/autoload.php
फाइल को पुनः जनरेट और अपडेट करने के लिए कमांड dump-autoload
को फिर से चलाना होगा।
PSR-4
classmap
अलावा, संगीतकार PSR-0
, classmap
और files
classmap
का भी समर्थन करता है। अधिक जानकारी के लिए ऑटोलॉड संदर्भ देखें।
जब आप /vendor/autoload.php
फ़ाइल शामिल करते हैं, तो यह संगीतकार /vendor/autoload.php
एक आवृत्ति लौटाएगा। आप एक चर में शामिल कॉल के रिटर्न मूल्य को स्टोर कर सकते हैं और अधिक नामस्थान जोड़ सकते हैं। उदाहरण के लिए, टेस्ट सूट में ऑटोलोडिंग कक्षाओं के लिए यह उपयोगी हो सकता है।
$loader = require __DIR__ . '/vendor/autoload.php';
$loader->add('Application\\Test\\', __DIR__);