デモコードは次のとおりです
classClassOne{
functioncallClassOne(){
print"InClassOne";
}
}
classClassOneDelegator{
プライベート$ターゲット;
function__construct(){
$this->target[]=newClassOne();
}
function__call($name,$args){
foreach($this->targetas$obj){
$r=newReflectionClass($obj);
if($method=$r->getMethod($name)){
if($method->isPublic()&&!$method->isAbstract()){
Return$method->invoke($obj,$args);
}
}
}
}
}
$obj=newClassOneDelegator();
$obj->callClassOne();
?>
出力結果:
クラス1で
ClassOne クラスの代わりにプロキシ クラス ClassOneDelegator がメソッドの実装に使用されていることがわかります。
同様に、次のコードも実行できます:
classClassOne{
functioncallClassOne(){
print"InClassOne";
}
}
classClassOneDelegator{
プライベート$ターゲット;
functionaddObject($obj){
$this->target[]=$obj;
}
function__call($name,$args){
foreach($this->targetas$obj){
$r=newReflectionClass($obj);
if($method=$r->getMethod($name)){
if($method->isPublic()&&!$method->isAbstract()){
Return$method->invoke($obj,$args);
}
}
}
}
}
$obj=newClassOneDelegator();
$obj->addObject(newClassOne());
$obj->callClassOne();
?>