Apply SRP by keeping each class focused, and apply dependency inversion by depending on interfaces: ~~~php interface UserRepository { public function findById(int $id): ?User; } final class UserService { public function __construct( private UserRepository $repository, ) { } } ~~~ Use composition and constructor injection for testability; extract unrelated responsibilities instead of growing a large class.
Installs into .claude/skills of the current project.
Are you the author of Php Best Practices?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/hoangnguyen0403-php-best-practices-7a56ae44)
Apply SRP by keeping each class focused, and apply dependency inversion by depending on interfaces:
~~~php
interface UserRepository
{
public function findById(int $id): ?User;
}
final class UserService
{
public function __construct(
private UserRepository $repository,
) {
}
}
~~~
Use composition and constructor injection for testability; extract unrelated responsibilities instead of growing a large class.