Как получить доступ к св-вам объекта-контейнера из метода агрегированого объекта?

Alexander K.

Новичок
Как получить доступ к св-вам объекта-контейнера из метода агрегированого объекта?

Заранее извиняюсь, может вопрос ламерский, но хотелось бы знать...

PHP:
class c1 {
    var $c2;
    var $str = 'Some string';

    function c1() {
        $this->c2 = new c2();
    }
}

class c2 {
     function m1() {
           /* some code */
     }
}

$c1 = new c1();
Есть объект класса c1, в нём агрегируется объект c2...

Можно ли получить доступ из методов объекта c2 к св-вам объекта $с1 ?

Типа чтобы $c1->c2->m1() мог эхнуть содержимое $c1->str;

Те пара вариантов которые мне приходят в голову кажутся довольно кривыми:

1) обращаться к объекту c1 через $GLOBALS (полная бяка)

2) при инициализации c2 в конструкторе с1 передавать параметром конструктора ссылку на самого себя и в конструкторе c2 запоминать ссылку в чём-нибудь типа $this->parent_container (такой вариант тоже не очень нравится, надо заботиться о передаче ссылки :()

Вроде этого:

PHP:
class c1 {
    var $c2;
    var $str = 'Some string';

    function c1() {
        $this->c2 = new c2(&$this);
    }
}

class c2 {
     function c2(&$parent_container) {
          $this->parent_container =& $parent_container;
     }


     function m1() {
           echo $this->parent_container->str;
     }
}

$c1 = new c1();
$c1->c2->m1();
 

DiMA

php.spb.ru
Команда форума
удали из примера все &, кроме function c2(&$parent_container)

я так всегда делаю и мне до фени на изызски ООП
 

zerkms

TDD infected
Команда форума
function c2(&$parent_container) {
$this->parent_container =& $parent_container;
}
DiMA
если выделенный амперсанд убрать, то при присваивании произойдёт копирование объекта (я так понимаю пример написан в контексте пхп4) и & в прототипе функции потеряет смысл
то же самое и с другим & в конструкторе c1.
 

Alexander K.

Новичок
Пожалуй лишний амперсанд только в этой строке: $this->c2 = new c2(&$this);

Но это всё понятно и не особо интересно...

Хотелось бы получить доступ к variable scope родительского контейнера без всяких извращений

я так понимаю в этом случае действует 3 variable scope:
globals variable scope
variable scope объекта с1
variable scope объекта с2

К globals variable scope можно получить доступ через конструкцию global, либо $GLOBALS

Мне надо получить доступ к variable scope объекта с1 из методов объекта с2...

Возможно ли это вообще?
 

zerkms

TDD infected
Команда форума
Возможно ли это вообще?
у тебя должен быть другой вопрос: а нужно ли тебе это?
если уж ты программируешь, руководствуясь канонами ООП, то будь добр обеспечь доступ к свойствам класса посредством геттеров, и подобные вопросы сразу же отпадут
 

Alexander K.

Новичок
zerkms
наверно ты прав, вероятно лучше следовать канонам ООП, чем выискивать сиюминутное удобство

я так понимаю "доступ посредством геттеров" это и есть тот механизм что я привёл во втором варианте? или подразумевалось нечто другое?
 

zerkms

TDD infected
Команда форума
ну всё зависит от того что тебе нужно...
если объяснишь задачу - можно будет подумать что да как
а навскидку - $obj->a()->b(); - мне лично такое использование не нравится, но опять же - не зная задачи гадать бессмысленно
 

Alexander K.

Новичок
смысл не в $obj->a->b();

есть некий класс, в нём массив объектов модулей расширяющих его функциональность, нужно чтобы модуль имел доступ к св-вам и методам основного класса (и как следствие к другим модулям)

опять же не особо уверен в правильности подхода...

---
зашёл по ссылке в твоей подписи... ничего если 2-3 нескромных вопросов задам? :) ты в одиночку cms разрабатываешь? с какой целью? уверен что стоит ориентироваться на php5 (он далеко не на всех хостингах есть)?
 

zerkms

TDD infected
Команда форума
хм.... звучит как то страшно.....
не вполне понял проблему - но интуитивно есть предложение посмотреть The Mediator Pattern
 

alex77

Новичок
Как получить доступ к св-вам объекта-контейнера из метода агрегированого объекта?
PHP:
<?
// внешний
class outer
{
        var $p1;
        var $p2;
        function outer()
        {
                $this->p2=800;
                $this->p1=new inner($this);
        }
}
// внутренний
class inner
{
        var $parent;
        function inner($outer)
        {
                $this->parent = $outer;
        }
}
$out=new outer();
$in=$out->p1;
echo $in->parent->p2;#800
?>
 

zerkms

TDD infected
Команда форума
alex77
ты не думал что "можно сделать так" и "нужно сделать так" - немножко разные вещи?
 

alex77

Новичок
я ещё вот так пробовал:
PHP:
<?
// внешний
class outer
{
        var $p1;
        var $p2;
        function outer()
        {
                $this->p2 = 800;
                $this->p1 = new inner($this);
        }
}
// внутренний
class inner
{
        var $parent;
        function inner(&$outer)
        {
                $this->parent = $outer;
        }
}
$out=new outer();
$in=$out->p1;
echo $in->parent->p2;#800
echo '<br />';
$out->p2=100;
echo $out->p2;#100
echo '<br />';
$in=$out->p1;
echo $in->parent->p2;# должно быть 100 но на самом деле 800
?>
подскажите, пожалуйста, в чем ошибка ?
вариант "в ДНК" не предлагать :)
 

zerkms

TDD infected
Команда форума
function inner(&$outer)
{
$this->parent =& $outer;
}

-~{}~ 30.05.06 21:33:

и

$in =& $out->p1;
 

zerkms

TDD infected
Команда форума
PHP:
<?php
// внешний
class outer
{
        var $p1;
        var $p2;
        function outer()
        {
                $this->p2 = 800;
                $this->p1 =& new inner($this);
        }
}
// внутренний
class inner
{
        var $parent;
        function inner(&$outer)
        {
                $this->parent =& $outer;
        }
}
$out=&new outer();
$in=&$out->p1;
echo $in->parent->p2;#800
echo '<br />';
$out->p2=100;
echo $out->p2;#100
echo '<br />';
$in=&$out->p1;
echo $in->parent->p2;#100
?>
мораль: юзайте пхп5
 
Сверху