PHP中使用反射机制实现动态代理

演示用代码如下所示:
  1. <?php
  2. class ClassOne {
  3.     function callClassOne() {
  4.         print "In Class One";
  5.     }
  6. }
  7. class ClassOneDelegator {
  8.     
  9.     private $targets;
  10.     function __construct() {
  11.         $this->target[] = new ClassOne();
  12.     }
  13.     
  14.     function __call($name, $args) {
  15.         foreach ($this->target as $obj) {
  16.             $r = new ReflectionClass($obj);
  17.             if ($method = $r->getMethod($name)) {
  18.                 if ($method->isPublic() && !$method->isAbstract()) {
  19.                     return $method->invoke($obj, $args);
  20.                 }
  21.             }
  22.         }
  23.     }
  24. }
  25. $obj = new ClassOneDelegator();
  26. $obj->callClassOne();
  27. ?>
输出结果:
In Class One

可见,通过代理类 ClassOneDelegator来代替 ClassOne类来实现他的方法。
同样的,如下的代码也是能够运行的:
  1. <?php
  2. class ClassOne {
  3.     function callClassOne() {
  4.         print "In Class One";
  5.     }
  6. }
  7. class ClassOneDelegator {
  8.     
  9.     private $targets;
  10.     function addObject($obj) {
  11.         $this->target[] = $obj;
  12.     }
  13.     
  14.     function __call($name$args) {
  15.         foreach ($this->target as $obj) {
  16.             $r = new ReflectionClass($obj);
  17.             if ($method = $r->getMethod($name)) {
  18.                 if ($method->isPublic() && !$method->isAbstract()) {
  19.                     return $method->invoke($obj$args);
  20.                 }
  21.             }
  22.         }
  23.     }
  24. }
  25. $obj = new ClassOneDelegator();
  26. $obj->addObject(new ClassOne());
  27. $obj->callClassOne();
  28. ?>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值