Dependency injection container
Dependency Inversion Principle (DIP) suggests we create modular low-coupling code with the help of extracting clear abstraction subsystems.
For example, if you want to simplify a big class you can split it into many chunks of routine code and extract every chunk into a new simple separated class.
The principle says that your low-level chunks should implement an all-sufficient and clear abstraction, and high-level code should work only with this abstraction and not low-level implementation.
When we split a big multitask class into small specialized classes, we face the issue of creating dependent objects and injecting them into each other.
If we could create one instance before:
$service = new MyGiantSuperService();