Home Quizzes Leaderboard Competitions Learn Hire Us
About Contact
Log In Sign Up
Learn PHP Namespaces & Autoloading

Namespaces & Autoloading

⏱ 18 min read read
What are Namespaces?

Namespaces prevent class name conflicts when combining code from
different libraries. They are like packages in Java.

// File: src/Models/User.php

namespace App\Models;

class User {

public function \_\_construct(public string $name) {}

}

Using Namespaced Classes:

// Option 1: Full qualified name

$user = new \App\Models\User('Alice');

// Option 2: use statement (preferred)

use App\Models\User;

$user = new User('Alice');

// Option 3: Alias

use App\Models\User as UserModel;

$user = new UserModel('Alice');

// Multiple use statements

use App\Models\{User, Product, Order};

Composer --- PHP's Package Manager:

Composer is to PHP what pip is to Python or npm is to Node.js.

# Install a package

composer require vendor/package

# Install dev dependency

composer require --dev phpunit/phpunit

# Install all dependencies from composer.json

composer install

# Autoload classes (put in every PHP file)

require_once 'vendor/autoload.php';

PSR-4 Autoloading maps namespace prefixes to directories.

With Composer autoloading, you never need require/include for your
own classes.

Composer creates vendor/autoload.php --- always require this file
once at the top.

Popular packages: guzzlehttp/guzzle (HTTP), monolog/monolog
(logging),

vlucas/phpdotenv (.env files), league/flysystem (filesystem).

composer.json Structure:

{

"name": "myapp/myapp",

"require": {

"php": ">=8.1",

"guzzlehttp/guzzle": "^7.0"

},

"autoload": {

"psr-4": {

"App\\": "src/"

}

}

}
Code Example
<?php

// File: src/Models/Student.php

// namespace App\Models;

//

// class Student {

// public function \_\_construct(

// private string $id,

// public string $name,

// private array $grades = []

// ) {}

//

// public function addGrade(string $subject, float $grade): void {

// $this->grades[$subject] = $grade;

// }

//

// public function getAverage(): float {

// return empty($this->grades) ? 0.0 : array_sum($this->grades) /
count($this->grades);

// }

// }

// File: index.php

// require_once 'vendor/autoload.php'; // Composer autoload

// use App\Models\Student;

// use App\Models\School;

// Simulated namespace demo (all in one file for this lesson)

namespace App\Models;

class Student {

private array $grades = [];

public function \_\_construct(

private string $id,

public string $name

) {}

public function addGrade(string $subject, float $grade): void {

$this->grades[$subject] = $grade;

}

public function getAverage(): float {

return empty($this->grades) ? 0.0

: array_sum($this->grades) / count($this->grades);

}

public function \_\_toString(): string {

return "{$this->id}: {$this->name} (avg: " .
number_format($this->getAverage(), 1) . ")";

}

}

// Usage

$alice = new Student('S001', 'Alice');

$alice->addGrade('Math', 92);

$alice->addGrade('English', 88);

echo $alice . "\n"; // S001: Alice (avg: 90.0)

// Without 'use' --- fully qualified name

$bob = new \App\Models\Student('S002', 'Bob');

$bob->addGrade('Math', 75);

echo $bob . "\n"; // S002: Bob (avg: 75.0)

?>
← Traits & Advanced OOP Closures, Generators & Functional PHP →

Log in to track your progress and earn badges as you complete lessons.

Log In to Track Progress