skarah
@skarah

Чтение свойств другого обекта в php

Доброго времени суток, Хаброюзеры!
У меня к вам следующий вопрос по ООП на php:
Есть два объекта двух разных классов, как при выполнении функции одного считать инфу из свойства другого?
Причем связь между ними следующая:
Есть объект $a класса A и объект класса B, A и B никак друг друга не наследуют, но одно из свойств класса $a(пусть будет $a->c) представляет собой объект класса B(тоесть $a->c=new B()).

Так вот суть вопроса в том, чтобы выполняя какую-то функцию $a->c->d(), из этой функции получить доступ к свойству $a->e, причем вызывать функцию не B::d(), а именно $a->c->d().
Такое возможно? Если да, то как?
Заранее благодарю!
  • Вопрос задан
  • 3161 просмотр
Решения вопроса 1
shushu
@shushu
А как вы себе это представляете?
Откуда объект B будет знать к какому именно из экземпляров класса A нужно обратится?
Если речь идет о статичных вызовах и не известно какой класс нужно вызывать, т.е переменная $c класса B может содержаться как в классе A так и в классе D, а вызывать метод d() нужно в том классе из которого был вызван этот метод то можно сделать через ж извратится и сделать тестовый екзепшн, отловить его, и в нём будет сказано из какого класса он был вызван:

class TestException extends Exception{};

class A{
    private $c;
    public static $e = 'Hello World';
    public function __construct(){
        $this->c = new B();
    }

    public function test(){
        return $this->c->d();
    }
}

class B{
    public function d(){
        try{
            throw new TestException();
        }catch(TestException $e){
            $trace = $e->getTrace();
            $class = $trace[1]['class'];

            $vars = get_class_vars($class);
            return $vars['e'];
       
            /*
            либо:
            return $class::$e;
            если php >= 5.3
            */

        }catch(Exception $e){
        }
        return null;
    }
}

$a = new A();
var_dump( $a->test() );
// out: string(11) "Hello World"


Если это так, то я вам советую почитать про рефлексию (Reflection in php)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dohlik
@dohlik
Гм… А Вам не кажется, что что-то неправильно в используемом Вами алгоритме? Попробуйте его описать тут, может придумаем что-то.

Очевидно, что выполнять действие должен объект, располагающий исходными данными в максимальном объеме. А данном случае это $a (он содержит как объект класса B, так и свойство $a->e). Скорее всего он не может выполнить все действия из метода $a->c->d() по все той же причине, поэтому внутри нашего идеального метода $a->x() должен вызываться $a->c->d() для получения данных об $a->c.

Конечно, можно все это сделать просто сохранив в объекте $a->c ссылку на родителя, но по мне это скорее костыль.
Ответ написан
Комментировать
@himik
передать в $a->c->d($this)
и внутри d($obj) забирать $obj->e
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы