2011-01-30 6 views
4

Пожалуйста, обратите внимание на этот код:Получить экземпляр класса вызывающего абонента из другого объекта

class Foo { 

    public $barInstance; 

    public function test() { 
     $this->barInstance = new Bar(); 
     $this->barInstance->fooInstance = $this; 
     $this->barInstance->doSomethingWithFoo(); 
    } 

} 

class Bar { 
    public $fooInstance; 

    public function doSomethingWithFoo() { 
     $this->fooInstance->something(); 
    } 
} 

$foo = new Foo(); 
$foo->test(); 

Вопрос: можно ли позволить "$barInstance", из какого класса он был создан (или называется), не имея следующая строка:. "$this->barInstance->fooInstance = $this;"

+1

№ (наполнительный текст) – mhitza

+0

Какова ваша мотивация для избежания этой линии? Вы его не предоставили. – erisco

ответ

3

в теории, вы могли бы быть в состоянии сделать это с debug_backtrace(), которые как объекты трассировки стека, но лучше не делать, это не хорошо кодирования Я думаю, что лучший способ для вас будет быть переданным родительским объектом в баре ctor:

class Foo { 

    public $barInstance; 

    public function test() { 
     $this->barInstance = new Bar($this); 
     $this->barInstance->doSomethingWithFoo(); 
    } 
} 

class Bar { 
    protected $fooInstance; 

    public function __construct(Foo $parent) { 
     $this->fooInstance = $parent; 
    } 

    public function doSomethingWithFoo() { 
     $this->fooInstance->something(); 
    } 
} 

Это ограничивает аргумент правильным типом (Foo), удалите его, если это не то, что вы хотите. Передача его в ctor обеспечит, что Bar никогда не будет в состоянии, когда doSomethingWithFoo() потерпит неудачу.

+0

'debug_backtrace' вернет информацию о выполнении, а не фактические экземпляры объекта, как он хотел бы. – mhitza

+3

@mhitza часть вывода debug_backtrace() (а именно параметр «объект») - это $ this, который использовался в методе вызывающего абонента, т. Е. В вашем случае экземпляр «Foo». Поместите вызов debug_backtrace() в 'Bar' ctor и посмотрите, что он производит. Не пытайтесь делать это дома (например, в реальном коде), хотя это плохой стиль для использования функций отладки для целей, не связанных с отладкой, и может привести к множеству проблем с надежностью (например, как вы гарантируете только Foo-экземпляр Bar?) – StasM

+0

действительно, среди значений 'debug_backtrace' являются фактическим экземпляром объектов. – mhitza