Kodokon kodokon.com

नेमस्पेस, ऑटोलोडिंग और Composer

अपने कोड को PSR-4 नेमस्पेस से संरचित करें और Composer को आपके लिए क्लास और निर्भरताएँ लोड करने दें।

8 मिनट · 3 प्रश्न

इस पाठ को Kodokon में खोलें

नेमस्पेस नामों की टक्कर समाप्त कर देते हैं: दो लाइब्रेरियाँ बिना किसी विरोध के अपनी-अपनी एक Client क्लास परिभाषित कर सकती हैं। सार्वभौमिक परंपरा: एक वेंडर उपसर्ग (App, Acme\Blog), फिर उप-नेमस्पेस जो फ़ोल्डर वृक्ष को प्रतिबिंबित करें। use किसी पूर्ण-योग्य (fully qualified) नाम को वर्तमान फ़ाइल में आयात करता है, और अस्पष्टता की स्थिति में as उसका नाम बदल देता है। एक फ़ाइल = एक क्लास = एक नेमस्पेस: यह अनुशासन कोई शैलीगत सनक नहीं है, यह ऑटोलोडिंग की बुनियादी शर्त है।

PHP
<?php

declare(strict_types=1);

namespace App\Service;

use App\Repository\UserRepository;
use Psr\Log\LoggerInterface as Logger;

final class UserService
{
    public function __construct(
        private UserRepository $users,
        private Logger $logger,
    ) {
    }
}
एक src/Service/UserService.php फ़ाइल: नेमस्पेस, आयात, उपनाम।

ऑटोलोडिंग क्लास फ़ाइलों को माँग के अनुसार लोड करती है: अब कोई मैनुअल require नहीं। PSR-4 मानक इस मैपिंग को परिभाषित करता है: एक नेमस्पेस उपसर्ग को एक रूट फ़ोल्डर से जोड़ा जाता है, और हर उप-नेमस्पेस एक सबफ़ोल्डर बन जाता है। इस तरह App\Service\UserService, src/Service/UserService.php पर सुलझ जाता है। परदे के पीछे, सब कुछ spl_autoload_register पर निर्भर करता है - यहाँ न्यूनतम कार्यान्वयन है, जिसे समझना सार्थक है भले ही आप इसे कभी दोबारा न लिखें:

PHP
<?php

declare(strict_types=1);

spl_autoload_register(function (string $class): void {
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/src/';

    if (!str_starts_with($class, $prefix)) {
        return;
    }

    $relative = substr($class, strlen($prefix));
    $path = $baseDir
        . str_replace('\\', '/', $relative)
        . '.php';

    if (is_file($path)) {
        require $path;
    }
});

echo 'Autoloader registered';
हाथ से बनाया गया PSR-4 ऑटोलोडर: उपसर्ग, रूट फ़ोल्डर, पथ में रूपांतरण।

Composer इन सबका औद्योगीकरण कर देता है: composer.json आपकी निर्भरताएँ और आपकी PSR-4 मैपिंग घोषित करता है - आमतौर पर "autoload": { "psr-4": { "App\\\\": "src/" } } - फिर composer install पैकेजों को vendor/ में डाउनलोड करता है और vendor/autoload.php उत्पन्न करता है, जो आपके पूरे एप्लिकेशन का इकलौता require है। एक अनिवार्य भेद: उत्पादन में आवश्यक पैकेजों के लिए require, और टूलिंग (परीक्षण, स्थैतिक विश्लेषण) के लिए require-dev, जिसे --no-dev से डिप्लॉयमेंट से बाहर रखा जाता है।

BASH
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -o
जीवनचक्र: आरंभ करना, निर्भरताएँ जोड़ना, ऑटोलोडर को पुनः उत्पन्न करना।

ज्ञान जांच

सुनिश्चित करें कि आपको इस पाठ के मुख्य बिंदु याद हैं।

  1. PSR-4 के अनुसार, यदि App\ उपसर्ग src/ की ओर इंगित करता है, तो क्लास App\Blog\PostRepository कहाँ स्थित है?
    • src/App/Blog/PostRepository.php
    • src/Blog/PostRepository.php
    • src/blog/postrepository.php
  2. Composer द्वारा उत्पन्न ऑटोलोडिंग का लाभ पाने के लिए आपको कौन सी फ़ाइल शामिल करनी चाहिए?
    • composer.json
    • vendor/autoload.php
    • रूट में बनाई जाने वाली एक autoload.php
  3. composer require --dev किसलिए है?
    • केवल विकास के लिए एक पैकेज इंस्टॉल करना, जिसे --no-dev से डिप्लॉयमेंट से बाहर रखा जाता है
    • पैकेज का एक अस्थिर संस्करण इंस्टॉल करना
    • पैकेज को मशीन पर वैश्विक (global) रूप से इंस्टॉल करना