Skip to content

PHP Composer Autoload — Complete Guide to Dependency Management

DodaTech Updated 2026-06-28 3 min read

In this tutorial, you will learn about PHP Composer Autoload. We cover key concepts, practical examples, and best practices to help you master this topic.

Composer is PHP's dependency manager that handles package installation, autoloading, version management, and ensures reproducible builds across environments.

What You'll Learn

By the end of this tutorial, you'll initialize Composer projects, install and manage dependencies, configure PSR-4 autoloading, understand version constraints, and use scripts.

Why Composer Matters

Before Composer, PHP projects bundled manual dependencies or relied on PEAR. Composer automates dependency resolution, autoloading, and version management, making PHP projects portable and maintainable.

Real-World Use

A Laravel project depends on 50+ packages. Composer installs them all, resolves version conflicts, generates an optimized autoloader, and locks versions in composer.lock for consistent deployments.

Composer Learning Path

flowchart LR
  A[Namespaces] --> B[Composer]
  B --> C[DI]
  C --> D[MVC]
  D --> E[REST API]
  A --> F{You Are Here}
  style F fill:#f90,color:#fff

Installing Composer

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
# Or install globally:
mv composer.phar /usr/local/bin/composer

Initializing a Project

composer init
# Or create composer.json manually:
{
    "name": "myapp/myapp",
    "description": "My PHP Application",
    "type": "project",
    "require": {
        "php": ">=8.1",
        "monolog/monolog": "^3.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    }
}

Installing Packages

composer install           # Install from composer.lock
composer update            # Update all packages
composer require monolog/monolog  # Add a package
composer require --dev phpunit/phpunit  # Dev dependency
composer remove monolog/monolog  # Remove a package

PSR-4 Autoloading

{
    "autoload": {
        "psr-4": {
            "App\\": "src/",
            "App\\Models\\": "src/Models/"
        }
    }
}
<?php
require __DIR__ . "/vendor/autoload.php";
use App\Models\User;
$user = new User("Alice");

Version Constraints

{
    "require": {
        "monolog/monolog": "^3.0",       // >=3.0, <4.0
        "guzzlehttp/guzzle": "~7.0",     // >=7.0, <7.1
        "phpunit/phpunit": "10.*",       // >=10.0, <11.0
        "laravel/framework": ">=10.0 <11.0",  // Exact range
        "acme/package": "dev-main"       // Dev branch
    }
}

Scripts and Hooks

{
    "scripts": {
        "test": "phpunit",
        "cs-fix": "php-cs-fixer fix src/",
        "pre-update-cmd": [
            "@clear-cache"
        ],
        "post-install-cmd": [
            "App\\Setup::initialize"
        ]
    }
}
composer run test
composer run cs-fix

Common Mistakes

1. Committing vendor Directory

The vendor directory should be in .gitignore. Run composer install during deployment instead.

2. Using require Instead of require-dev

Dev tools (testing, coding standards) belong in require-dev. Production should not install them.

3. Not Locking Versions

Always commit composer.lock. It ensures all environments use the exact same dependency versions.

4. Running composer update in Production

composer update changes versions. Use composer install which uses composer.lock.

5. Forgetting to Run composer dump-autoload

After adding or changing autoload configuration, run composer dump-autoload to regenerate the autoloader.

Practice Questions

1. What does Composer do?

Manages PHP dependencies: installs packages from Packagist, autoloads classes, and version-locks dependencies.

2. What is the difference between composer install and composer update?

install uses composer.lock (predictable). update resolves latest versions and updates composer.lock.

3. What is PSR-4 autoloading?

A standard mapping namespace prefixes to directory paths. App\Models\User auto-loads from src/Models/User.php.

4. What is the vendor directory?

Where Composer installs packages. It's generated and should not be committed to version control.

5. Challenge: Set up a Composer project with PSR-4 autoloading and a dependency.

{
    "require": { "monolog/monolog": "^3.0" },
    "autoload": { "psr-4": { "App\\": "src/" } }
}
<?php
require "vendor/autoload.php";
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger("app");
$log->pushHandler(new StreamHandler("app.log", Logger::WARNING));
$log->warning("This is a warning");

FAQ

What is Packagist?

Packagist is the main Composer repository. It hosts thousands of PHP packages that Composer can install.

Can I use Composer without Packagist?

Yes. Add repositories to composer.json for private packages using VCS or path types.

What is the difference between Composer and npm?

Composer is for PHP (like npm for Node.js, pip for Python). Both manage dependencies and autoloading.

How do I update a single package?

composer update vendor/package (only that package). Or composer require vendor/package:^2.0 to change version.

What is the platform.php requirement?

Specifies the minimum PHP version. Composer checks the installed PHP version against this.

Mini Project: Composer Project Setup

Create a PHP project with Composer, PSR-4 autoloading, and Monolog logging.

mkdir myapp && cd myapp
composer init --name="myapp/app" --type=project
composer require monolog/monolog
{
    "autoload": { "psr-4": { "App\\": "src/" } }
}
<?php
// src/Helpers/Logger.php
namespace App\Helpers;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
class AppLogger {
    public static function create(): Logger {
        $log = new Logger("app");
        $log->pushHandler(new StreamHandler(__DIR__ . "/../../logs/app.log", Logger::DEBUG));
        return $log;
    }
}

What's Next

PHP Dependency Injection PHP MVC Pattern PHP REST API

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro