Skip to content

Single Responsibility Principle

A class should have only one reason to change.

Robert C. Martin (Uncle Bob)

Example 1: Authentication

Authentication

Before: One class handling multiple responsibilities

<?php

final class Auth
{
    public function login(string $username, string $password): bool
    {
        // Check credentials
        return true;
    }

    public function logout(): void
    {
        // Destroy session
    }

    public function hashPassword(string $password): string
    {
        // Hash password
        return '';
    }

    public function generateToken(): string
    {
        // Generate auth token
        return '';
    }
}

After: Applying the Single Responsibility Principle

<?php

final class AuthService
{
    public function login(string $username, string $password): bool
    {
        // Check credentials
        return true;
    }

    public function logout(): void
    {
        // Destroy session
    }
}

final class PasswordHasher
{
    public function hash(string $password): string
    {
        // Hash password
        return '';
    }
}

final class TokenGenerator
{
    public function generate(): string
    {
        // Generate auth token
        return '';
    }
}

Example 2: Payment Processing

Payment Processing

Before: One class handling multiple responsibilities

<?php

class Payment
{
    public function process(float $amount): void
    {
        // Process payment
    }

    public function validateCard(string $cardNumber): bool
    {
        // Validate card
        return true;
    }

    public function generateReceipt(): void
    {
        // Generate receipt
    }

    public function sendReceiptEmail(): void
    {
        // Send receipt via email
    }
}

After: Applying the Single Responsibility Principle

<?php

final class PaymentProcessor
{
    public function process(float $amount): void
    {
        // Process payment
    }
}

final class CardValidator
{
    public function validate(string $cardNumber): bool
    {
        // Validate card
        return true;
    }
}

final class ReceiptGenerator
{
    public function generate(): void
    {
        // Generate receipt
    }
}

final class ReceiptMailer
{
    public function send(): void
    {
        // Send receipt email
    }
}

Example 3: User Registration

Registration Flow

Before: One class handling multiple responsibilities

<?php

class User
{
    public function __construct(
        public string $name,
        public string $email
    ) {}

    public function save(): void
    {
        // Save user to database
    }

    public function update(): void
    {
        // Update user in database
    }

    public function delete(): void
    {
        // Delete user from database
    }

    public function sendWelcomeEmail(): void
    {
        // Send email to user
    }
}

After: Applying the Single Responsibility Principle

<?php

final class User
{
    public function __construct(
        public readonly string $name,
        public readonly string $email
    ) {}
}

final class UserRepository
{
    public function save(User $user): void
    {
        // Persist user
    }

    public function update(User $user): void
    {
        // Update user
    }

    public function delete(User $user): void
    {
        // Remove user
    }
}

final class UserMailer
{
    public function sendWelcomeEmail(User $user): void
    {
        // Send welcome email
    }
}