0
0
PHPprogramming~10 mins

PSR-4 directory mapping in PHP - Step-by-Step Execution

Choose your learning style9 modes available
Concept Flow - PSR-4 directory mapping
Namespace Prefix
Map to Base Directory
Class Name
Remove Prefix from Class
Replace Namespace Separators with Directory Separators
Append .php Extension
Load File from Mapped Directory
PSR-4 maps a namespace prefix to a base directory. Class names are converted to file paths by removing the prefix, replacing namespace separators with directory separators, and adding .php.
Execution Sample
PHP
<?php
spl_autoload_register(function ($class) {
    $prefix = "App\\";
    $base_dir = __DIR__ . "/src/";
    if (str_starts_with($class, $prefix)) {
        $relative_class = substr($class, strlen($prefix));
        $file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';
        if (file_exists($file)) {
            require $file;
        }
    }
});
This code registers an autoloader that loads classes in the 'App\' namespace from the 'src/' directory by converting namespace to file path.
Execution Table
StepInput ClassCheck PrefixRelative ClassFile PathFile Exists?Action
1App\Controller\HomeControllerYes (starts with 'App\\')Controller\HomeController/path/src/Controller/HomeController.phpYesRequire file
2App\Model\UserYes (starts with 'App\\')Model\User/path/src/Model/User.phpNoDo nothing
3Other\ServiceNo (does not start with 'App\\')---Do nothing
💡 Stop after checking prefix and file existence for each class.
Variable Tracker
VariableStartAfter 1After 2After 3
$class-App\Controller\HomeControllerApp\Model\UserOther\Service
$prefixApp\\App\\App\\App\\
$base_dir/path/src//path/src//path/src//path/src/
$relative_class-Controller\HomeControllerModel\User-
$file-/path/src/Controller/HomeController.php/path/src/Model/User.php-
Key Moments - 3 Insights
Why do we remove the namespace prefix from the class name before building the file path?
Because the base directory already corresponds to the namespace prefix, so removing it avoids repeating the prefix in the file path. See execution_table rows 1 and 2 where $relative_class excludes the prefix.
What happens if the class does not start with the namespace prefix?
The autoloader ignores it and does not try to load a file. See execution_table row 3 where prefix check fails and no file is loaded.
Why do we replace backslashes '\\' with slashes '/' in the relative class name?
Because namespaces use backslashes but file paths use directory separators (slashes). This conversion creates the correct file path. See execution_table rows 1 and 2 for file path construction.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the file path for the class 'App\\Model\\User'?
A/path/src/User.php
B/path/src/App/Model/User.php
C/path/src/Model/User.php
D/path/Model/User.php
💡 Hint
Check the 'File Path' column in execution_table row 2.
At which step does the autoloader decide not to load any file because the prefix does not match?
AStep 1
BStep 3
CStep 2
DNone
💡 Hint
Look at the 'Check Prefix' column in execution_table row 3.
If the base directory was changed to '/app/src/', how would the file path for 'App\\Controller\\HomeController' change?
A/app/src/Controller/HomeController.php
B/path/src/Controller/HomeController.php
C/app/Controller/HomeController.php
D/src/Controller/HomeController.php
💡 Hint
Refer to variable_tracker row for $base_dir and how it affects $file.
Concept Snapshot
PSR-4 maps a namespace prefix to a base directory.
Remove the prefix from the full class name.
Replace namespace separators '\\' with directory separators '/'.
Append '.php' to get the file path.
Load the file from the base directory.
This enables automatic class loading by namespace.
Full Transcript
PSR-4 directory mapping works by linking a namespace prefix to a base directory. When a class is requested, the autoloader checks if the class name starts with the prefix. If yes, it removes the prefix from the class name to get the relative class. Then it replaces namespace backslashes with directory slashes and adds '.php' to form the file path inside the base directory. If the file exists, it is loaded. If the prefix does not match or the file is missing, the autoloader does nothing. This process allows PHP to automatically find and load class files based on their namespaces and directory structure.