PHP में OOP क्लास ऑटोलोडिंग के लिए कस्टम फ़ंक्शन

अक्सर, डिफ़ॉल्ट ऑटोलोडिंग किसी कारण से आपके लिए उपयुक्त नहीं हो सकती है। ऐसे मामले में, आप अपनी खुद की ऑटोलोडिंग लिख सकते हैं।

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

php<?php
  spl_autoload_register(function($class) {
    // वेरिएबल $class में नेमस्पेस सहित क्लास का नाम होगा
  });
?>

और फ़ंक्शन का कर्तव्य होगा क्लास के नाम के आधार पर उस क्लास को require के माध्यम से लोड करना। यानी इस फ़ंक्शन के अंदर हमें क्लासेस को लोड करने के लिए अपना नियम लिखना होगा, यानी नामकरण के लिए अपना समझौता।

चलिए अपनी ऑटोलोडिंग का एक उदाहरण लिखते हैं। मान लीजिए, उदाहरण के लिए, हम कहते हैं कि वेबसाइट रूट से क्लास फ़ाइल का पथ नेमस्पेस जैसा ही होगा, लेकिन केस सेंसिटिविटी को बनाए रखते हुए।

यानी, अगर हमारे पास Core\Admin\PageController क्लास है, तो उसका पथ Core/Admin/PageController.php होना चाहिए।

जैसा कि आप देख रहे हैं, क्लास नाम को उसके नेमस्पेस के साथ बदलने के लिए बस बैकस्लैश को फॉरवर्ड स्लैश में बदलना होगा, और क्लास नाम में .php जोड़ना होगा। आइए इसे करते हैं:

php<?php
  spl_autoload_register(function($class) {
    $filename = str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

हालाँकि, हमारे पास फ़ाइल का रिलेटिव पथ (वेबसाइट रूट के सापेक्ष) बनेगा। बेहतर होगा कि पूर्ण पथ बनाया जाए, इस तरह:

php<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $filename = $root . '/' . str_replace('\\', '/', $class) . '.php';
    require($filename);
  });
?>

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

php<?php
  spl_autoload_register(function($class) {
    $root = $_SERVER['DOCUMENT_ROOT'];
    $ds = DIRECTORY_SEPARATOR;
    
    $filename = $root . $ds . str_replace('\\', $ds, $class) . '.php';
    require($filename);
  });
?>
Задание 1

मेरे द्वारा बनाए गए ऑटोलोड फ़ंक्शन का परीक्षण करें।

Задание 2

ऑटोलोडिंग के लिए अपना खुद का नियम बनाएं और इसे लागू करें।