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

  •   2009-07-31/23:01
  • 演示用代码如下所示:

    <?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();
    ?>


    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多