Цепочка вызовов PHP, определение метода из которого вызван текущий метод

Sanu0074
На сайте с 31.08.2012
Offline
110
1544

Допустим есть class Test с методами filter и select, оба они могут быть использованы в цепочке вызовов. Например:

$o = new Test();

$res = $o->filter()->select();

Вопрос в том, как можно определить внутри метода select(), имя метода который его вызвал в цепочке? т.е. в данном случае это filter...

p.s. может вопрос и выглядит абсурдным и есть способ решить эту задачу иным путем, но суть именно в том чтобы определить filter внутри select.

siv1987
На сайте с 02.04.2009
Offline
427
#1

debug_backtrace()

Sanu0074
На сайте с 31.08.2012
Offline
110
#2

siv1987, еще вопрос, как можно сделать такой вызов:

$o->filter->select();  

т.е. чтобы filter отработала, в нее параметры не передаются, и вызвалась seect().

siv1987
На сайте с 02.04.2009
Offline
427
#3

Если я правильно понял задачу то - __call

Sanu0074
На сайте с 31.08.2012
Offline
110
#4

siv1987, что-то я не пойму как это сделать..

siv1987
На сайте с 02.04.2009
Offline
427
#5

А что вы хотите сделать? Уточните задачу, а то не понятно что вам нужно, вроде бы тут обычный вызов.

Sanu0074
На сайте с 31.08.2012
Offline
110
#6

siv1987, так выглядит класс


class Test{
private $f = FALSE;

public function filter() {
$this->f = TRUE;
return $this;
}

public function select() {
$this->f = FALSE;
return;
}

}

Как сделать так чтобы вызов можно было осуществить именно так:

$o->filter->select();  

а не так:

$o->filter()->select();  

Это я имею ввиду..

ДП
На сайте с 23.11.2009
Offline
203
#7
Sanu0074:

Вопрос в том, как можно определить внутри метода select(), имя метода который его вызвал в цепочке? т.е. в данном случае это filter...

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

siv1987
На сайте с 02.04.2009
Offline
427
#8

А смысл? Так хотябы имеется логическое представление как работает эта строчку.


class Test{
function __call($a, $b)
{
print_r($a);
print_r($b);
}

function __get($a)
{
print_r($a);
return $this;
}
}

$obj = new Test();
$obj->filter->select();

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий