Writing Clean Code: SOLID Principles in PHP

November 10, 2025
2 min read
By Nour Sallam

Table of Contents

This is a list of all the sections in this post. Click on any of them to jump to that section.

Writing Clean Code: SOLID Principles in PHP

Writing code that works is easy. Writing code that is maintainable, testable, and scalable is the real challenge. The SOLID principles are your guide.

S: Single Responsibility Principle

A class should have only one reason to change.

Bad: A User model that handles database interactions, sends emails, and generates PDF invoices. Good: A User model, a UserMailer service, and an InvoiceGenerator service.

O: Open/Closed Principle

Classes should be open for extension but closed for modification.

Instead of a huge switch statement in a PaymentProcessor class, use an interface PaymentGateway and inject the implementation (Stripe, PayPal, etc.).

L: Liskov Substitution Principle

Subtypes must be substitutable for their base types. If Bird is a parent of Penguin, and Bird has a fly() method, you have a problem because Penguins can’t fly.

I: Interface Segregation

Clients shouldn’t depend on methods they don’t use.

Don’t force a Worker interface to have eat() and work() if you have robots that work but don’t eat. Split them into Workable and Feedable.

D: Dependency Inversion

Depend on abstractions, not concretions.

Inject UserRepositoryInterface into your controller instead of the concrete Eloquent User model. This allows you to easily swap the database implementation for a mock during testing.

Conclusion

Adhering to SOLID principles might seem like extra work upfront, but it pays dividends when your project grows and requirements change.