<?php
class Logger
{
public function log($data)
{
// Actually log your data
echo 'LOGGING DATA: ' . $data . PHP_EOL;
}
}
class Hassan
{
public function multipleByTwo($i)
{
// Doing business logic
$i = (int)$i * 2;
return $i;
}
}
class HassanLoggerDecorator
{
protected $hassan;
protected $logger;
public function __construct(Hassan $hassan, Logger $logger)
{
$this->hassan = $hassan;
$this->logger = $logger;
}
public function __call($method, $args)
{
$this->logger->log(sprintf("Calling method: %s with args: %s", $method, print_r($args, true)));
$result = call_user_func_array(
array($this->logger, $method),
$args
);
$this->logger->log(sprintf("Got result: %s", $result));
return $result;
}
}
// Now you can use your Hassan object without logging...
$hassan = new Hassan;
echo "3 multipled by two is: " . $hassan->multiplyByTwo(3) . PHP_EOL;
// Now let's log the output of Hassan, without having it as a dependency!! (Never FORCE logging in anything you do, it's ALWAYS optional)
$hassanWithLoggingFunctionality = new HassanLoggerDecorator($hassan, new Logger);
echo $hassanWithLoggingFunctionality->multiplyByTwo(3);