2014-07-21 3 views
1

Интересно, можем ли мы объединить «внутренне» внутри самого класса? Например, у меня есть эти два класса,Как связать внутри внутри класса?

Первый класс,

class Object1 
{ 
    public $item; 
    public $obj2; 

    public function __construct() 
    { 
     $this->obj2 = new Object2(); 
    } 

    public function chain1() 
    { 
     $this->item = 'Chain1 '; 

     return $this; 
    } 

    public function chain2() 
    { 

     //$this->item = $this->obj2->chain3(); // works ok. 
     $this->item = $this->obj2->chain3()->chain1(); // how to chain yourself? 

     return $this; 
    } 
} 

второй класс,

class Object2 
{ 
    public $item; 
    public function chain3() 
    { 
     $this->item = 'Chain 3 '; 
     return $this; 
    } 

    public function chain4() 
    { 
     $this->item = 'Chain4 '; 
     return $this; 
    } 
} 

$obj1 = new Object1(); 
print_r($obj1->chain2()->item); 

ошибка,

atal error: Call to undefined method Object2::chain1() in C:... 

Мне нужно цепи chain1() в классе Ojbect1().

$this->item = $this->obj2->chain3()->chain1(); 

Возможно ли это?

+5

Нет, это не возможно, и при этом это не имеет смысла. Что бы вы выиграли? Пожалуйста, не говорите мне, что «в редакторе было бы круче». – Jon

+5

chain3() возвращает объект Object2; так как вы можете ожидать, что затем вызовите метод в классе Object1? –

ответ

1

Вы можете приковать метод, возвращая $this из него:

class foo 
{ 
    public $foo; 
    public function yayThisChains() 
    { 
     return $this->chain()->chain2()->doIt(); 
    } 
    private function doIt() 
    { 
     $this->foo = 'bar'; 
     return $this; 
    } 
    private function chain2() { return $this; } 
    private function chain() { return $this; } 
} 

$foo = new foo(); 
echo $foo->yayThisChains()->foo; 

Проблема заключается в том вы пытаетесь цепи двух различных объектов, используя один и тот же $this. Вы можете расширить свои классы так $this относится к тому же классу, а не строить object2 в object1 через конструктор:

class Object2 extends Object1 
+3

dat код style ... – PeeHaa

+2

@PeeHaa исправить. только через два года. –

Смежные вопросы