演示用代码如下所示:
<?php <BR>class ClassOne { <BR>function callClassOne() { <BR>print "In Class One"; <BR>} <BR>} <BR>class ClassOneDelegator { <BR>private $targets; <BR>function __construct() { <BR>$this->target[] = new ClassOne(); <BR>} <BR>function __call($name, $args) { <BR>foreach ($this->target as $obj) { <BR>$r = new ReflectionClass($obj); <BR>if ($method = $r->getMethod($name)) { <BR>if ($method->isPublic() && !$method->isAbstract()) { <BR>return $method->invoke($obj, $args); <BR>} <BR>} <BR>} <BR>} <BR>} <BR>$obj = new ClassOneDelegator(); <BR>$obj->callClassOne(); <BR>?><BR>
输出结果:
In Class One
可见,通过代理类ClassOneDelegator来代替ClassOne类来实现他的方法。
同样的,如下的代码也是能够运行的:
<?php <BR>class ClassOne { <BR>function callClassOne() { <BR>print "In Class One"; <BR>} <BR>} <BR>class ClassOneDelegator { <BR>private $targets; <BR>function addObject($obj) { <BR>$this->target[] = $obj; <BR>} <BR>fu<span style="color:transparent">本文来源gaodai#ma#com搞*!代#%^码$网!</span><strong>搞代gaodaima码</strong>nction __call($name, $args) { <BR>foreach ($this->target as $obj) { <BR>$r = new ReflectionClass($obj); <BR>if ($method = $r->getMethod($name)) { <BR>if ($method->isPublic() && !$method->isAbstract()) { <BR>return $method->invoke($obj, $args); <BR>} <BR>} <BR>} <BR>} <BR>} <BR>$obj = new ClassOneDelegator(); <BR>$obj->addObject(new ClassOne()); <BR>$obj->callClassOne(); <BR>?> <BR>