Bird
Raised Fist0
PHPprogramming~20 mins

PSR-4 directory mapping in PHP - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
PSR-4 Mastery
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2: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();
AFatal error: Class 'App\Utils\Helper' not found
BHello from Helper!\n
CParse error: syntax error, unexpected token
DHello from Helper!
Attempts:
2 left
💡 Hint
Remember PSR-4 maps namespaces to directories, so the class file must be in the correct folder matching the namespace.
🧠 Conceptual
intermediate
1: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?
Alib/Vendor/Package/Sub/MyClass.php
Blib/MyClass.php
Clib/Sub/MyClass.php
Dlib/Sub/MyClass.class.php
Attempts:
2 left
💡 Hint
PSR-4 removes the namespace prefix and replaces backslashes with directory separators inside the mapped directory.
🔧 Debug
advanced
2: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:
AThe namespace prefix 'Acme\\' maps to 'src/Acme/', so the class file should be at 'src/Acme/Tools/Widget.php', which is correct, so no error.
BThe autoloader requires the class file to be named 'Widget.class.php' instead of 'Widget.php'.
CThe class Widget is missing a leading backslash in the namespace declaration.
DThe namespace prefix 'Acme\\' should map to 'src/', not 'src/Acme/', so the autoloader looks for 'src/Acme/Acme/Tools/Widget.php' which does not exist.
Attempts:
2 left
💡 Hint
Check how the namespace prefix maps to the directory and how the rest of the namespace is appended.
📝 Syntax
advanced
1: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?
A"MyApp\\Core": "app/core/"
B"MyApp\\Core\\": "app/core/"
C"MyApp\\Core\\": "app/core"
D"MyApp\\Core\\": "app\\core\\"
Attempts:
2 left
💡 Hint
PSR-4 requires the namespace prefix to end with double backslashes and directory path to end with a slash.
🚀 Application
expert
3: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?
AFoo, Bar, Helper, and Extra only
BHelper, Extra, and Old only
CFoo, Bar, Helper, Extra, and Old
DFoo, Bar, and Old only
Attempts:
2 left
💡 Hint
PSR-4 uses the longest matching namespace prefix to map classes to directories.

Practice

(1/5)
1. What is the main purpose of PSR-4 in PHP?
PSR-4 helps with:
easy
A. Mapping namespaces to directory paths for autoloading classes
B. Defining coding style rules for PHP files
C. Encrypting PHP source code for security
D. Managing database connections automatically

Solution

  1. Step 1: Understand PSR-4 role

    PSR-4 is a standard that maps PHP namespaces to folder paths to load classes automatically.
  2. Step 2: Compare options

    Only Mapping namespaces to directory paths for autoloading classes describes this mapping and autoloading purpose correctly.
  3. Final Answer:

    Mapping namespaces to directory paths for autoloading classes -> Option A
  4. Quick Check:

    PSR-4 = Namespace to folder mapping [OK]
Hint: PSR-4 links namespaces to folders for autoloading [OK]
Common Mistakes:
  • Confusing PSR-4 with coding style rules
  • Thinking PSR-4 encrypts code
  • Assuming PSR-4 manages databases
2. Which of the following is the correct way to define a PSR-4 autoload entry in composer.json?
easy
A. "autoload": { "psr-4": { "App": "src" } }
B. "autoload": { "psr-4": { "App/": "src\\" } }
C. "autoload": { "psr-4": { "App\\": "src/" } }
D. "autoload": { "psr-4": { "App\\": "src\\" } }

Solution

  1. Step 1: Check PSR-4 syntax in composer.json

    PSR-4 keys use double backslashes for namespace separator and forward slashes for folder paths.
  2. Step 2: Validate each option

    "autoload": { "psr-4": { "App\\": "src/" } } correctly uses "App\\" for namespace and "src/" for directory path.
  3. Final Answer:

    "autoload": { "psr-4": { "App\\": "src/" } } -> Option C
  4. Quick Check:

    Namespace ends with \\ and folder path uses / [OK]
Hint: Use double backslashes for namespaces, forward slashes for folders [OK]
Common Mistakes:
  • Using single backslash in JSON string
  • Mixing slashes in folder paths
  • Omitting trailing backslash in namespace
3. Given this composer.json snippet:
{
  "autoload": {
    "psr-4": {
      "MyApp\\": "app/"
    }
  }
}

Where should the class MyApp\Controllers\HomeController be located?
medium
A. app/Controllers/HomeController.class.php
B. app/MyApp/Controllers/HomeController.php
C. src/Controllers/HomeController.php
D. app/Controllers/HomeController.php

Solution

  1. Step 1: Understand PSR-4 mapping

    The namespace prefix "MyApp\\" maps to folder "app/". The rest of the namespace after prefix maps to subfolders.
  2. Step 2: Map class namespace to file path

    Class "MyApp\\Controllers\\HomeController" maps to "app/Controllers/HomeController.php".
  3. Final Answer:

    app/Controllers/HomeController.php -> Option D
  4. Quick Check:

    Namespace after prefix = Controllers/HomeController.php [OK]
Hint: Namespace after prefix = folder path + class name.php [OK]
Common Mistakes:
  • Adding namespace prefix folder again
  • Using wrong base folder like src/
  • Wrong file extension
4. You have this composer.json autoload section:
{
  "autoload": {
    "psr-4": {
      "Lib\\": "lib/"
    }
  }
}

But when you try to use Lib\Utils\Helper, PHP cannot find the class. What is the likely problem?
medium
A. Composer dump-autoload was not run after adding the class
B. The class file is not located at lib/Utils/Helper.php
C. The namespace prefix "Lib\\" should not have trailing backslash
D. The folder path should be "lib\\" with double backslashes

Solution

  1. Step 1: Check common PSR-4 issues

    Folder path uses forward slashes, trailing backslash in namespace prefix is correct, so options C and D are wrong.
  2. Step 2: Verify autoload update

    After adding new classes, you must run composer dump-autoload to update the autoloader.
  3. Final Answer:

    Composer dump-autoload was not run after adding the class -> Option A
  4. Quick Check:

    Run dump-autoload after changes [OK]
Hint: Always run composer dump-autoload after adding classes [OK]
Common Mistakes:
  • Changing folder slashes incorrectly
  • Removing trailing backslash in namespace prefix
  • Forgetting to update autoloader
5. You want to autoload two separate namespaces in your project:
"App\\": "src/", "Vendor\\Package\\": "vendor/package/src/"
Which composer.json snippet correctly sets this up?
hard
A. "autoload": { "psr-4": { "App/": "src/", "Vendor/Package/": "vendor/package/src/" } }
B. "autoload": { "psr-4": { "App\\": "src/", "Vendor\\Package\\": "vendor/package/src/" } }
C. "autoload": { "psr-4": { "App\\": "src/", "Vendor\\Package": "vendor/package/src" } }
D. "autoload": { "psr-4": { "App": "src", "Vendor\\Package\\": "vendor/package/src/" } }

Solution

  1. Step 1: Check namespace keys format

    Namespace keys must end with double backslashes to separate namespaces properly.
  2. Step 2: Check folder paths format

    Folder paths use forward slashes and end with a slash for directories.
  3. Step 3: Validate each option

    "autoload": { "psr-4": { "App\\": "src/", "Vendor\\Package\\": "vendor/package/src/" } } correctly uses double backslashes for both namespaces and trailing slashes for folders.
  4. Final Answer:

    "autoload": { "psr-4": { "App\\": "src/", "Vendor\\Package\\": "vendor/package/src/" } } -> Option B
  5. Quick Check:

    Double backslashes + trailing slash folder paths [OK]
Hint: Use double backslashes for namespaces and trailing slash for folders [OK]
Common Mistakes:
  • Omitting trailing backslash in namespace keys
  • Using forward slashes in namespace keys
  • Missing trailing slash in folder paths
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard