2009-07-24 5 views
4

Можно ли задуматься о цепочке вызовов метода, чтобы определить, в какой точке вы находитесь в цепочке звонков? По крайней мере, можно ли определить, является ли метод последним вызовом в цепочке?Цели метода PHP - Отражение?

$instance->method1()->method2()->method3()->method4() 

Можно ли сделать то же самое с использованием свойств, возвращающих экземпляры объектов?

$instances->property1->property2->property3->property4 
+1

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

ответ

0
$instances->property1->property2->property3->property4->method(); 

ИЛИ

$instances->property1->property2->property3->property4=some_value 

Что касается первого вопроса: не без добавления какой-то код, чтобы отслеживать, где вы находитесь в цепочке.

1

Для прикованных методов вы можете использовать PHP5's overloading methods (__call в этом случае).

Я не вижу причин, по которым вы хотите отслеживать привязанные свойства, но если вы настаиваете на этом, вы можете использовать метод перегрузки __get на своих классах, чтобы добавить нужные функции.

Пожалуйста, дайте мне знать, если вы не можете понять, как использовать приведенные выше предложения.

+0

Это, кажется, лучший подход до сих пор, хотя я до сих пор не понимаю, почему кто-то хочет отслеживать позицию вызова метода/свойства. –

1

debug_backtrace() не будет корректным в отношении использования «плавных интерфейсов» (обозначенное имя для «цепочки»), поскольку каждый метод возвращается до того, как будет вызван следующий.

+1

Вы правы. Исправлен ответ. Спасибо, что указали это. –

0

Я не думаю, что существует класс, способный узнать, когда был сделан последний вызов метода. Я думаю, вам нужно что-то -> execute(); вызов функции в конце цепи.

Кроме того, включение таких функций, на мой взгляд, вероятно, сделает код слишком волшебным и неожиданным пользователем и/или будет иметь признаки неисправности.

+0

Это мое намерение на этом этапе. Написание ORM, волшебство, безусловно, находится в меню! –

2

Если все методы, которые вы вызываете, возвращают объект, чтобы создать свободный интерфейс (в отличие от цепочки разных объектов вместе), должно быть довольно тривиально записывать вызовы методов в самом объекте.

например:

class Eg { 
    protected $_callStack = array(); 

    public function f1() 
    { 
     $this->_callStack[] = __METHOD__; 
     // other work 
    } 

    public function f2() 
    { 
     $this->_callStack[] = __METHOD__; 
     // other work 
    } 

    public function getCallStack() 
    { 
     return $this->_callStack; 
    } 
} 

Затем цепные вызовы как

$a = new Eg; 
$a->f1()->f2()->f1(); 

оставит стек вызовов, как: массива ('f1', 'f2', 'f1');

+0

Это один из подходов, который я рассмотрел, хотя он перемещает некоторые данные вдали от возвращаемых объектов, делая его не совсем таким сплоченным. Основная проблема заключается в том, что я все еще не могу определить, когда я нахожусь в конце цепи.Таким образом, я застрял, имея что-то вроде: «$ a-> f1() -> f2() -> f1() -> go();" для запуска конца цепочки. –

+1

Правильно, я не думаю, что какой-либо способ автоматически обнаружить «конец цепи». Если вы пытаетесь создать SQL-запрос (что является моим лучшим предположением, учитывая другие комментарии), то реализация магического метода __toString в классе может смотреть на стек вызовов и выводить окончательную строку SQL. Именно так реализованы многие помощники по представлению в Zend Framework. Итак, делаем echo $ a-> f1() -> f2() -> f1(); (или любая другая функция, вызывающая касту в строку), будет неявно вызвать метод __toString() - выполнение работы вашего метода go(). –

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