DI is new concept to me. So, I do not have that much experience to say that it allows for more flexibility and control in my own words yet. To get familiar with this programming structure, I am writing this post.
Except PHP primitive data type, arguments are passed by references not by values. Object are one of argument types it can be passed by reference. Here is one explae of DI in PHP for logging error or status messages.
class Logger {
private $logs = [];
public function log($message) {
$this->logs[] = $message
}
public function getLogs() {
return $this->logs;
}
public function displayLogs() {
foreach ($this->logs as $log) {
echo "Message: " . $log['message'] . "<br><br>";
}
}
}
Usage Example
class SomeClass {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function doSomething() {
// Some logic
if (/* some error condition */) {
$this->logger->log("An error occurred in doSomething");
} else {
$this->logger->log("Operation successful in doSomething");
}
}
}
class AnotherClass {
private $logger;
public function __construct(Logger $logger) {
$this->logger = $logger;
}
public function doSomethingElse() {
// Some logic
if (/* another error condition */) {
$this->logger->log("An error occurred in doSomethingElse");
} else {
$this->logger->log("Operation successful in doSomethingElse");
}
}
}
$logger = new Logger();
$obj1 = new SomeClass($logger);
$obj2 = new AnotherClass($logger);
$obj1->doSomething();
$obj2->doSomethingElse();
$logger->displayLogs();