📡 You're offline — showing cached content
New version available!
Quick Access
JavaScript Beginner

PHP Composer and Autoloading: PSR-4 Explained

Learn Composer from scratch — installing packages, PSR-4 autoloading, version constraints, and composer.lock for reproducible builds.

EzyCoders Admin January 12, 2026 10 min read 3 views
PHP Composer and PSR-4 Autoloading Guide
Share: Twitter LinkedIn WhatsApp

What is Composer?

Composer is PHP's dependency manager. It downloads libraries, manages version conflicts, and handles autoloading automatically. No more manual require statements. Every modern PHP project uses it.

Essential Commands

# Install globally
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer

# Create new project
composer init

# Add packages
composer require guzzlehttp/guzzle        # HTTP client
composer require phpmailer/phpmailer      # Email
composer require --dev phpunit/phpunit   # Dev only

# Install from lock file (use on servers — exact versions)
composer install --no-dev --optimize-autoloader

# Update packages (dev only)
composer update

# Regenerate autoloader after adding classes
composer dump-autoload

composer.json Explained

{
    "name": "ezycoders/my-app",
    "require": {
        "php": ">=8.1",
        "guzzlehttp/guzzle": "^7.0",
        "phpmailer/phpmailer": "^6.8"
    },
    "require-dev": {
        "phpunit/phpunit": "^10.0"
    },
    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    }
}

PSR-4 Autoloading

<?php
// Directory structure:
// src/
//   Models/User.php     → namespace App\Models;  class User
//   Services/Mailer.php → namespace App\Services; class Mailer

// src/Models/User.php
namespace App\Models;

class User {
    public function __construct(
        public readonly int    $id,
        public readonly string $name
    ) {}
}

// index.php — ONE require, everything else autoloaded
require_once 'vendor/autoload.php';

use App\Models\User;
use App\Services\Mailer;

$user = new User(1, 'Rahul');  // No require needed!
echo $user->name;              // Rahul

Version Constraints

{
    "require": {
        "vendor/pkg": "1.2.3",      // EXACT version
        "vendor/pkg": "^1.2.3",     // >=1.2.3 <2.0.0
        "vendor/pkg": "~1.2.3",     // >=1.2.3 <1.3.0
        "vendor/pkg": ">=1.0 <2.0", // range
        "vendor/pkg": "dev-main"    // from git branch
    }
}

Q: Difference between composer install and composer update?

install reads composer.lock and installs exact recorded versions. update ignores the lock file, finds latest allowed versions from composer.json, and creates a new lock file. Always use install on production servers.


Q: Should you commit the vendor folder to Git?

Never. Add vendor/ to .gitignore. Commit only composer.json and composer.lock. Run composer install to reproduce the vendor directory. Vendor can be hundreds of MB — committing it bloats the repo unnecessarily.

EzyCoders Admin
Written by
EzyCoders Admin

Team Lead and Full-Stack Developer with experience in PHP, JavaScript, SQL, DSA, and System Design. Passionate about software engineering, scalable web technologies, and helping developers prepare for coding interviews and tech careers through practical tutorials and professional guidance.

Comments (0)

No comments yet. Be the first!

Leave a Comment