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.
Comments (0)
No comments yet. Be the first!
Leave a Comment