2009-07-24 53 views
4

是否可以反思一系列方法調用以確定您在調用鏈中的哪個點? 至少,是否有可能辨別方法是否是鏈中的最後一個呼叫?PHP方法鏈 - 反映?

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

是否有可能使用返回對象實例的屬性來做同樣的事情?

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

出於興趣,你能解釋一下你爲什麼要這樣做嗎?看起來有點奇怪,你想讓一個類知道如何從外部調用它的方法。 – 2009-07-24 15:52:08

回答

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

OR

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

至於第一個問題:沒有加入一些代碼來跟蹤你在哪裏鏈。

1

對於鏈接的方法,你可以使用PHP5的overloading methods(在這種情況下__call)。

我看不出有任何理由,你爲什麼會想跟蹤鏈接的屬性,但如果你堅持這樣的話,你可以使用__get上你的類重載方法來添加所需的功能。

請讓我知道,如果你不能弄清楚如何使用上述建議。

+0

這似乎是迄今爲止最好的方法,儘管我仍然不明白爲什麼有人會想跟蹤鏈接方法/屬性調用的位置。 – 2009-08-04 16:34:11

1

debug_backtrace()是不會對使用的「流利接口」(爲「鏈」中所示的正確名稱)是正確的,因爲每一個方法返回,下一個被調用之前。

+1

你是對的。修復了答案。感謝您指出這一點。 – 2009-07-24 16:00:13

0

我不認爲有對知道一個類時,它的最後一個方法調用被做了可行的途徑。我認爲你需要某種 - > execute();函數調用在鏈的末尾。

而且,在我看來,讓這樣的功能很可能使代碼過於神奇和驚喜的用戶和/或有馬車症狀。

+0

這在某種程度上是我的意圖。 寫一個ORM,魔術絕對是菜單上的! – 2009-07-26 14:45:24

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();」觸發鏈條的結束。 – 2009-07-27 12:53:57