Challenge - 5 Problems
PSR-4 Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate2:00remaining
PSR-4 Namespace to Directory Mapping Output
Given the following PSR-4 autoload configuration and class usage, what will be the output when the script runs?
PHP
<?php // composer.json autoload section // "autoload": { // "psr-4": { "App\\": "src/" } // } // File: src/Utils/Helper.php namespace App\Utils; class Helper { public static function greet() { return "Hello from Helper!"; } } // File: test.php require 'vendor/autoload.php'; use App\Utils\Helper; echo Helper::greet();
Attempts:
2 left
💡 Hint
Remember PSR-4 maps namespaces to directories, so the class file must be in the correct folder matching the namespace.
✗ Incorrect
The PSR-4 autoload maps the namespace 'App\\' to the 'src/' directory. The class Helper is in namespace 'App\\Utils', so it should be in 'src/Utils/Helper.php'. The autoloader loads the class correctly, so calling Helper::greet() outputs 'Hello from Helper!'.
🧠 Conceptual
intermediate1:30remaining
PSR-4 Namespace Prefix and Directory Mapping
In PSR-4 autoloading, if the namespace prefix is "Vendor\\Package\\" mapped to the directory "lib/", where should the class
Vendor\Package\Sub\MyClass be located?Attempts:
2 left
💡 Hint
PSR-4 removes the namespace prefix and replaces backslashes with directory separators inside the mapped directory.
✗ Incorrect
PSR-4 autoloading removes the namespace prefix 'Vendor\\Package\\' and maps the rest 'Sub\\MyClass' to 'Sub/MyClass.php' inside the 'lib/' directory.
🔧 Debug
advanced2:30remaining
Why does this PSR-4 autoload succeed in finding the class?
Given this composer.json autoload section and file structure, why does the autoloader succeed to load the class
Acme\Tools\Widget?
composer.json snippet:
{
"autoload": {
"psr-4": {
"Acme\\": "src/Acme/"
}
}
}
File structure:
- src/
- Acme/
- Tools/
- Widget.php
Widget.php content:
Attempts:
2 left
💡 Hint
Check how the namespace prefix maps to the directory and how the rest of the namespace is appended.
✗ Incorrect
The prefix 'Acme\\' maps to 'src/Acme/', so for the class 'Acme\Tools\Widget' the autoloader strips 'Acme\\' leaving 'Tools\Widget', which becomes 'Tools/Widget.php' appended to 'src/Acme/' resulting in 'src/Acme/Tools/Widget.php'. This exactly matches the file structure, so the class loads successfully.
📝 Syntax
advanced1:30remaining
Identify the PSR-4 compliant namespace and directory mapping
Which of the following composer.json autoload psr-4 mappings is correctly set up for the namespace
MyApp\Core\ with classes stored in app/core/ directory?Attempts:
2 left
💡 Hint
PSR-4 requires the namespace prefix to end with double backslashes and directory path to end with a slash.
✗ Incorrect
Option B correctly uses double backslashes at the end of the namespace prefix and ends the directory path with a slash. Option B misses the trailing backslashes in the namespace prefix. Option B misses the trailing slash in the directory path. Option B uses backslashes in the directory path which is invalid in JSON and for PSR-4.
🚀 Application
expert3:00remaining
Determine the number of classes autoloaded by PSR-4
Given this composer.json autoload section and directory structure, how many classes will be autoloaded correctly by PSR-4?
composer.json snippet:
{
"autoload": {
"psr-4": {
"Lib\\": "lib/",
"Lib\\Utils\\": "lib/utils/"
}
}
}
Directory structure:
- lib/
- Foo.php (namespace Lib; class Foo)
- Bar.php (namespace Lib; class Bar)
- utils/
- Helper.php (namespace Lib\Utils; class Helper)
- Extra.php (namespace Lib\Utils; class Extra)
- Old.php (namespace Lib; class Old)
Which classes will be autoloaded correctly?
Attempts:
2 left
💡 Hint
PSR-4 uses the longest matching namespace prefix to map classes to directories.
✗ Incorrect
The prefix 'Lib\\Utils\\' maps to 'lib/utils/', so Helper and Extra are loaded from there. The prefix 'Lib\\' maps to 'lib/', so Foo and Bar are loaded from 'lib/'. The class Old is in namespace 'Lib' but located in 'lib/utils/Old.php' which does not match the 'Lib\\' prefix directory, so it will not be autoloaded correctly.