演示用代码如下所示:
输出结果:
In Class One
可见,通过代理类 ClassOneDelegator来代替 ClassOne类来实现他的方法。
同样的,如下的代码也是能够运行的:
- <?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();
- ?>