<?php
class TargetClass
{
public function A($a, $b) {}
public function B($c, $d) {}
public function C($e, $f) {}
}
class LoggingDecorator
{
private $_target;
public function __construct($target)
{
$this->_target = $target;
}
public function __call($name, $params)
{
$this->_log($name, $params);
}
private function _log($name, $params)
{
echo $name . ' has been called with params: ' . implode(', ', $params) . '<br>'; }
}
$target = new TargetClass();
$logger = new LoggingDecorator($target);
$logger->A(1, 2);
$logger->A(3, 4);
PD9waHAKCmNsYXNzIFRhcmdldENsYXNzCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBBKCRhLCAkYikge30KICAgIHB1YmxpYyBmdW5jdGlvbiBCKCRjLCAkZCkge30KICAgIHB1YmxpYyBmdW5jdGlvbiBDKCRlLCAkZikge30KfQoKY2xhc3MgTG9nZ2luZ0RlY29yYXRvcgp7CiAgICBwcml2YXRlICRfdGFyZ2V0OwoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdGFyZ2V0KQogICAgewogICAgICAgICR0aGlzLT5fdGFyZ2V0ID0gJHRhcmdldDsKICAgIH0KICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9fY2FsbCgkbmFtZSwgJHBhcmFtcykKICAgIHsKICAgICAgICAkdGhpcy0+X2xvZygkbmFtZSwgJHBhcmFtcyk7CiAgICAgICAgCiAgICAgICAgcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KGFycmF5KCR0aGlzLT5fdGFyZ2V0LCAkbmFtZSksICRwYXJhbXMpOwogICAgfQogICAgCiAgICBwcml2YXRlIGZ1bmN0aW9uIF9sb2coJG5hbWUsICRwYXJhbXMpCiAgICB7CiAgICAgICAgZWNobyAkbmFtZSAuICcgaGFzIGJlZW4gY2FsbGVkIHdpdGggcGFyYW1zOiAnIC4gaW1wbG9kZSgnLCAnLCAkcGFyYW1zKSAuICc8YnI+JzsKICAgIH0KfQoKJHRhcmdldCA9IG5ldyBUYXJnZXRDbGFzcygpOwokbG9nZ2VyID0gbmV3IExvZ2dpbmdEZWNvcmF0b3IoJHRhcmdldCk7CgokbG9nZ2VyLT5BKDEsIDIpOwokbG9nZ2VyLT5BKDMsIDQpOw==