The dependency inversion principle states that entities should depend on abstractions and not on concretions. That is, a high level module should not depend on a low level module, rather the abstraction. As per the definition found on Wikipedia:
"One should depend upon abstractions. Do not depend upon concretions."
This principle is important as it plays a major role in decoupling our software.
The following is an example of a class that violates the DIP:
class Mailer { // Implementation... } class NotifySubscriber { public function notify($emailTo) { $mailer = new Mailer(); $mailer->send('Thank you for...', $emailTo); } }
Here we can see a notify
method within the NotifySubscriber
class coding in a dependency towards the Mailer
class. This makes for tightly coupled code, which is what we are trying to avoid. To rectify the problem, we can pass the dependency through the class constructor, or possibly via some other method. Furthermore...