Le code de démonstration est le suivant :
<?php
classe ClasseUn {
fonction callClassOne() {
imprimer « En classe 1 » ;
}
}
classe ClassOneDelegator {
cibles $ privées ;
fonction __construct() {
$this->target[] = new ClassOne();
}
fonction __call ($ nom, $ args) {
foreach ($this->target as $obj) {
$r = nouvelle ReflectionClass($obj);
si ($méthode = $r->getMethod($nom)) {
if ($method->isPublic() && !$method->isAbstract()) {
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = nouveau ClassOneDelegator();
$obj->callClassOne();
?>
Résultat de sortie :
En première classe
On peut voir que sa méthode est implémentée via la classe proxy ClassOneDelegator au lieu de la classe ClassOne.
De même, le code suivant peut également être exécuté :
<?php
classe ClasseUn {
fonction callClassOne() {
imprimer « En classe 1 » ;
}
}
classe ClassOneDelegator {
cibles $ privées ;
fonction addObject ($ obj) {
$this->target[] = $obj;
}
fonction __call ($ nom, $ args) {
foreach ($this->target as $obj) {
$r = nouvelle ReflectionClass($obj);
si ($méthode = $r->getMethod($nom)) {
if ($method->isPublic() && !$method->isAbstract()) {
return $method->invoke($obj, $args);
}
}
}
}
}
$obj = nouveau ClassOneDelegator();
$obj->addObject(new ClassOne());
$obj->callClassOne();
?>