PHP 反射机制实现动态代理的代码

  演示用代码如下所示:

  

复制代码 代码如下:

  <?php

  class ClassOne {

  function callClassOne() {

  print "In Class One";

  }

  }

  class ClassOneDelegator {

  private $targets;

  function __construct() {

  $this->target[] = new ClassOne();

  }

  function __call($name, $args) {

  foreach ($this->target as $obj) {

  $r = new ReflectionClass($obj);

  if ($method = $r->getMethod($name)) {

  if ($method->isPublic() && !$method->isAbstract()) {

  return $method->invoke($obj, $args);

  }

  }

  }

  }

  }

  $obj = new ClassOneDelegator();

  $obj->callClassOne();

  ?>

  输出结果:

  In Class One

  可见,通过代理类ClassOneDelegator来代替ClassOne类来实现他的方法。

  同样的,如下的代码也是能够运行的:

  

复制代码 代码如下:

  <?php

  class ClassOne {

  function callClassOne() {

  print "In Class One";

  }

  }

  class ClassOneDelegator {

  private $targets;

  function addObject($obj) {

  $this->target[] = $obj;

  }

  function __call($name, $args) {

  foreach ($this->target as $obj) {

  $r = new ReflectionClass($obj);

  if ($method = $r->getMethod($name)) {

  if ($method->isPublic() && !$method->isAbstract()) {

  return $method->invoke($obj, $args);

  }

  }

  }

  }

  }

  $obj = new ClassOneDelegator();

  $obj->addObject(new ClassOne());

  $obj->callClassOne();

  ?>