PHP Namespaces are not the same as the Directory Structure

Freshbits Web Solutions's photo
Freshbits Web Solutions
·Mar 16, 2022·

2 min read

PHP Namespaces are not the same as the Directory Structure

Photo by Randy Fath on Unsplash

Subscribe to my newsletter and never miss my upcoming articles

Let's start with a question: We have a PHP class SalesController.php with the namespace App/Http/Controllers and it is located at app/Http/Controllers/SalesController.php

Where do you think the class Sale.php with the namespace App/Domain/Sales would be located?

Did you say app/Domain/Sales/Sale.php? Are you sure?

...

Well, it is located at src/Domain/Sales/Sale.php and it works.

Why so

Thanks to the PSR-4 autoloading, we can define the namespaces prefix and their corresponding base directories.

Following is the composer configuration to clear the doubt:

{
    "autoload": {
        "psr-4": {
            "App\\Http\\": "app/Http",
            "App\\Domain\\": "src/Domain"
        }
    }
}

Reasoning

First of all, namespacing allows you to divide your code files into multiple groups. That allows you to set the same name for two different classes as far as they belong to different namespaces.

This flexibility allows developers to follow their own conventions over the framework conventions keeping all the parties happy.

One additional benefit when using namespaces in the code is easier directory renames. No need to do 'find & replace' in all the files that require your classes. Changing the base directory of the namespace does the job.

Fun Fact

You can set multiple base directories for a single namespace prefix. Example:

{
    "autoload": {
        "psr-4": { "Domain\\": ["src/", "lib/"] }
    }
}

Not sure why one would go for this as it is a bit confusing. But it's possible, however.

Story ends

In case you cannot find a class or directory by following the namespace words, do check the autoload config once. You may get the answer. Sayonara!

 
Share this