2014-09-11 4 views
0

Проведено исследование, не найдено ответа.Объектно-ориентированный php - возврат к предыдущему объекту

Допустим, у меня есть эти два класса:

class foo { 

function create_boo() { 
    $boo = new boo($this); // creates boo 
    return $boo; // returns boo object 
} 

function a() { 
    //Do something complex here in class foo 
    return $this; 
} 

function b() { 
    //Do something complex here in class foo 
    return $this; 
} 

function c() { 
    //Do something complex here in class foo 
    return $this; 
} 

} 

class boo { 

private $prev; 

function boo ($prev) { // Constructor 
    $this->prev = $prev; //In my theory, this saves the previous object, so I can return to it, but doesnt work. 
    //do something 
} 

function a() { 
    //Do something complex in class boo 
    return $this; 
} 

function b() { 
    //Do something complex in class boo 
    return $this; 
} 

function c() { 
    //Do something complex in class boo 
    return $this; 
} 

function return_to_foo() { 
    return $this->prev; // should return back to previous object? 
} 
} 

Теперь, позвольте мне объяснить мою проблему и то, что я хочу сделать. Я могу легко создать класс Foo:

$foo = new foo(); 

И я могу использовать функции там

$foo->a()->c(); 

Он использует в настоящее время функции а затем с. Я могу поставить заказ рядом друг с другом. Предположим, я хочу создать boo и использовать функции там тоже.

$foo->create_boo()->b()->c(); 

Итак, я создал бу и использую материал там. Но скажем, теперь я хочу вернуться в предыдущее дерево, не закончив командную строку и вернусь с одной командой, поэтому вместо этого он начнет использовать команды foo?

$foo->create_boo()->b()->c()->return_to_foo(); //Next commands are from foo tree; 

Возможно ли это, и если да, то как я могу это сделать?

+3

В то время как я понимаю, ты написал этот пример в спешке, то неясно, что вы пытаетесь сделать, и поэтому трудно помочь. –

+0

'$ boo' будет локальной переменной внутри метода, созданной и уничтоженной при каждом вызове метода. Если вы хотите, чтобы этот новый объект $ boo каким-то образом был сохранен в объекте-контейнере, вам придется вместо этого '$ this-> boo'. –

+0

@Elven Можете ли вы изменить 'new $ boo' на' new boo' свой бит, запутывающий. –

ответ

0

Поскольку конструкторы PHP 5 должны иметь имя __construct(). Поэтому в вашем примере метод boo никогда не будет вызван, и поэтому свойство $prev не будет установлено. Измените свой метод boo на __construct, и все должно быть хорошо.

Edit:

В документации сказано, что для обеспечения обратной совместимости, он будет искать функции конструктора старого стиля.

http://php.net/manual/en/language.oop5.decon.php

+0

Странно, даже если я использую __construct, даже если он не работает, почти так же, как он не находит __construct():/... – Elven

+0

Хорошо, похоже, что он работает, и это проблема затмений, которая не знает, как вернуться в предыдущее дерево и предложить, что делать дальше:/... – Elven

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