Dependency injection is a technique that promotes loose coupling between different components. It involves passing dependencies to a class constructor or methods via arguments.
- It allows easy testing by injecting mock or stub objects.
- It makes code more flexible and adaptable to changes.
- It allow to reuse components in different contexts with different needs.
Dependencies are injected through the constructor arguments.
Example:
Class Logger {
public function log($message)
{
print $message;
}
}
class ActualClass {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function execute() {
$this->logger->log('executing');
}
}
$logger = new Logger;
$obj = new ActualClass($logger);
$obj->execute();
Dependencies are injected through separate setter methods.
Example:
Class Logger {
public function log($message)
{
print $message;
}
}
class ActualClass {
private $logger;
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
public function execute() {
$this->logger->log('executing');
}
}
$logger = new Logger;
$obj = new ActualClass;
$obj->setLogger($logger);
$obj->execute();
Dependencies are injected as arguments to methods.
Example:
Class Logger {
public function log($message)
{
print $message;
}
}
class ActualClass {
private $logger;
public function execute(Logger $logger) {
$this->logger = $logger;
$this->logger->log('executing');
}
}
$logger = new Logger;
$obj = new ActualClass;
$obj->execute($logger);
Real-World Example:
class Product {
public function __construct(public string $name, public float $price) {}
}
function calculateTotalPrice(array $products): float {
$total = 0;
foreach ($products as $product) {
// validating whether it is a class object of Product Class
if ($product instanceof Product) {
$total += $product->price;
} else {
// Handle invalid product
throw new InvalidArgumentException('Invalid product class object');
}
}
return $total;
}
// Usage:
$products = [
new Product('Product 1', 10.35),
new Product('Product 2', 50.75),
];
// Inject product class objects
$totalPrice = calculateTotalPrice($products);
echo $totalPrice;