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

本文介绍了一种使用PHP实现的代理模式案例,展示了如何通过代理类调用目标类的方法,并利用反射类检查方法的有效性和访问权限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

演示用代码如下所示:
  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. ?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值