अपने कोड को PSR-4 नेमस्पेस से संरचित करें और Composer को आपके लिए क्लास और निर्भरताएँ लोड करने दें।
इस पाठ को Kodokon में खोलेंनेमस्पेस नामों की टक्कर समाप्त कर देते हैं: दो लाइब्रेरियाँ बिना किसी विरोध के अपनी-अपनी एक Client क्लास परिभाषित कर सकती हैं। सार्वभौमिक परंपरा: एक वेंडर उपसर्ग (App, Acme\Blog), फिर उप-नेमस्पेस जो फ़ोल्डर वृक्ष को प्रतिबिंबित करें। use किसी पूर्ण-योग्य (fully qualified) नाम को वर्तमान फ़ाइल में आयात करता है, और अस्पष्टता की स्थिति में as उसका नाम बदल देता है। एक फ़ाइल = एक क्लास = एक नेमस्पेस: यह अनुशासन कोई शैलीगत सनक नहीं है, यह ऑटोलोडिंग की बुनियादी शर्त है।
<?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,
) {
}
}ऑटोलोडिंग क्लास फ़ाइलों को माँग के अनुसार लोड करती है: अब कोई मैनुअल require नहीं। PSR-4 मानक इस मैपिंग को परिभाषित करता है: एक नेमस्पेस उपसर्ग को एक रूट फ़ोल्डर से जोड़ा जाता है, और हर उप-नेमस्पेस एक सबफ़ोल्डर बन जाता है। इस तरह App\Service\UserService, src/Service/UserService.php पर सुलझ जाता है। परदे के पीछे, सब कुछ spl_autoload_register पर निर्भर करता है - यहाँ न्यूनतम कार्यान्वयन है, जिसे समझना सार्थक है भले ही आप इसे कभी दोबारा न लिखें:
<?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';Composer इन सबका औद्योगीकरण कर देता है: composer.json आपकी निर्भरताएँ और आपकी PSR-4 मैपिंग घोषित करता है - आमतौर पर "autoload": { "psr-4": { "App\\\\": "src/" } } - फिर composer install पैकेजों को vendor/ में डाउनलोड करता है और vendor/autoload.php उत्पन्न करता है, जो आपके पूरे एप्लिकेशन का इकलौता require है। एक अनिवार्य भेद: उत्पादन में आवश्यक पैकेजों के लिए require, और टूलिंग (परीक्षण, स्थैतिक विश्लेषण) के लिए require-dev, जिसे --no-dev से डिप्लॉयमेंट से बाहर रखा जाता है।
composer init --name acme/app --no-interaction
composer require monolog/monolog
composer require --dev phpunit/phpunit
composer dump-autoload -oApp\ उपसर्ग src/ की ओर इंगित करता है, तो क्लास App\Blog\PostRepository कहाँ स्थित है?composer require --dev किसलिए है?