Что должен делать код:
Цитата:
В приведенном ниже примере создается экземпляр класса с именем
ClassOneDelegator, делеrирующеrо свои полномочия друrим классам. При вызове метода он в первую очередь проверяет, имеется ли такой метод в классе ClassOne. Если метод не существует, выполняется попытка отыскать этот метод в друrих, зареrистрированных у него, классах. Реrистрация объекта производится с помощью метода addObject( ). Реrистрируемые объекты включаются в список в порядке реrистрации, в этом же порядке производится поиск объекта, который может удовлетворить запрос к объекту класса ClassOneOelegator.
ClassOneDelegator, делеrирующеrо свои полномочия друrим классам. При вызове метода он в первую очередь проверяет, имеется ли такой метод в классе ClassOne. Если метод не существует, выполняется попытка отыскать этот метод в друrих, зареrистрированных у него, классах. Реrистрация объекта производится с помощью метода addObject( ). Реrистрируемые объекты включаются в список в порядке реrистрации, в этом же порядке производится поиск объекта, который может удовлетворить запрос к объекту класса ClassOneOelegator.
CODE (htmlphp):
скопировать код в буфер обмена
скопировать код в буфер обмена
- <?php echo "<pre>";
- /*-----------------------------------------------------------------------*/
- class ClassOne {
- function callClassOne() {
- print "In Class One\n";
- }
- }
- class ClassTwo {
- function callClassTwo() {
- print "In Class Two\n";
- }
- }
- class ClassOneDelegator {
- private $targets;
- public function __construct()
- {
- $this->target[] = new ClassOne();
- }
- function addObject($obj) {
- $this->target[] = $obj;
- }
- function __call($name, $args) {
- foreach ($this->target as $obj) { // had a problem using "foreach" from example but OK with
- //while(list(,$obj) = each($this->target)) {
- $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 ClassTwo());
- $obj->callClassOne();
- $obj->callClassTwo();
- /*-----------------------------------------------------------------------*/
- echo "</pre>"; ?>