<?php
class Phone
{
public function addnewnumber($name, $number)
{
echo "Phone::addnnewnumber\n";
}
}
class Proxy
{
private $_target;
public function __construct($target)
{
$this->_target = $target;
}
public function __call($name, $params)
{
$callable = array($this->_target
, $name); get_class($this->_target
).'::'.$name, E_USER_ERROR); }
return $this->dispatch($callable, $params);
}
protected function dispatch($callable, $params)
{
}
}
class LoggingProxy extends Proxy
{
protected function dispatch($callable, $params)
{
echo "Before calling ".get_class($callable[0]).'::'.$callable[1]."\n"; $return = parent::dispatch($callable, $params);
echo "After calling ".get_class($callable[0]).'::'.$callable[1]."\n"; return $return;
}
}
$a = new LoggingProxy(new Phone);
$a->addnewnumber(1, 2);
PD9waHAKCmNsYXNzIFBob25lCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRuZXdudW1iZXIoJG5hbWUsICRudW1iZXIpCiAgICB7CiAgICAgICAgZWNobyAiUGhvbmU6OmFkZG5uZXdudW1iZXJcbiI7CiAgICB9Cn0KCmNsYXNzIFByb3h5CnsKICAgIHByaXZhdGUgJF90YXJnZXQ7CiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHRhcmdldCkKICAgIHsKICAgICAgICAkdGhpcy0+X3RhcmdldCA9ICR0YXJnZXQ7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NhbGwoJG5hbWUsICRwYXJhbXMpCiAgICB7CiAgICAgICAgJGNhbGxhYmxlID0gYXJyYXkoJHRoaXMtPl90YXJnZXQsICRuYW1lKTsKICAgICAgICBpZiAoIWlzX2NhbGxhYmxlKCRjYWxsYWJsZSkpIHsKICAgICAgICAgICAgdHJpZ2dlcl9lcnJvcignQ2FsbCB0byB1bmRlZmluZWQgbWV0aG9kICcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9jbGFzcygkdGhpcy0+X3RhcmdldCkuJzo6Jy4kbmFtZSwgRV9VU0VSX0VSUk9SKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkdGhpcy0+ZGlzcGF0Y2goJGNhbGxhYmxlLCAkcGFyYW1zKTsKICAgIH0KICAgIAogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BhdGNoKCRjYWxsYWJsZSwgJHBhcmFtcykKICAgIHsKICAgICAgICByZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJGNhbGxhYmxlLCAkcGFyYW1zKTsKICAgIH0KfQoKY2xhc3MgTG9nZ2luZ1Byb3h5IGV4dGVuZHMgUHJveHkKewogICAgcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc3BhdGNoKCRjYWxsYWJsZSwgJHBhcmFtcykKICAgIHsKICAgICAgICBlY2hvICJCZWZvcmUgY2FsbGluZyAiLmdldF9jbGFzcygkY2FsbGFibGVbMF0pLic6OicuJGNhbGxhYmxlWzFdLiJcbiI7CiAgICAgICAgJHJldHVybiA9IHBhcmVudDo6ZGlzcGF0Y2goJGNhbGxhYmxlLCAkcGFyYW1zKTsKICAgICAgICBlY2hvICJBZnRlciBjYWxsaW5nICIuZ2V0X2NsYXNzKCRjYWxsYWJsZVswXSkuJzo6Jy4kY2FsbGFibGVbMV0uIlxuIjsKICAgICAgICByZXR1cm4gJHJldHVybjsKICAgIH0KfSAgCgokYSA9IG5ldyBMb2dnaW5nUHJveHkobmV3IFBob25lKTsKJGEtPmFkZG5ld251bWJlcigxLCAyKTs=