इस बिंदु तक मैंने प्रक्रियात्मक स्टैंडअलोन ऑटोलोडर फ़ंक्शंस का उपयोग किया है और स्वचालित रूप से मेरे (आमतौर पर) नामांकित कक्षाओं को लोड करने के लिए spl_autoload_register() के साथ पंजीकृत किया है। हाल ही में, मैंने देखा है कि लोगों ने कुछ प्रमुख PHP ढांचे के साथ संयोजन के साथ ऑटोलोडर वर्गों के उपयोग का जिक्र किया है।PHP ऑटोलोडर वर्ग बनाम प्रक्रियात्मक autoloader समारोह?
लगभग सभी मेरे कोड ऑब्जेक्ट उन्मुख हैं, लेकिन मुझे वास्तव में इस उदाहरण में एक मूल कार्य पर "Autoloader" श्रेणी का उपयोग करने के फायदे नहीं दिखते हैं। और टेस्टेबिलिटी के मामले में, प्रक्रियाओं के कार्यों को सही तरीके से लोड करने के लिए मेरे परीक्षणों में class_exists() चेक का उपयोग करने के बारे में मुझे बहुत अच्छा लगता है।
तो मेरे सवालों का तीन हैं:
- क्या लाभ या सुविधाओं (यदि हो तो) मुझे बोलबाला हो सकता है बातें refactor और autoload वर्ग फ़ाइलों के लिए एक पूर्ण विकसित वस्तु का उपयोग शुरू करने?
- क्या मुझे स्पष्ट ओओपी सुविधाओं के बाहर यहां कुछ चमकदार फायदे हैं?
- क्या आप प्रक्रियात्मक या कक्षा ऑटोलोडर के लिए कोई मामला बना सकते हैं?
अद्यतन
नीचे एक ठेठ 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;
}
}
मैंने आपके प्रश्न से "उत्तर" भाग हटा दिया है क्योंकि यह वास्तव में प्रश्न के लिए अप्रासंगिक है। आपको अपना जवाब जोड़ने पर विचार करना चाहिए, यह संभवतः दूसरों की मदद करेगा :) – James