是否可以反思一系列方法調用以確定您在調用鏈中的哪個點? 至少,是否有可能辨別方法是否是鏈中的最後一個呼叫?PHP方法鏈 - 反映?
$instance->method1()->method2()->method3()->method4()
是否有可能使用返回對象實例的屬性來做同樣的事情?
$instances->property1->property2->property3->property4
是否可以反思一系列方法調用以確定您在調用鏈中的哪個點? 至少,是否有可能辨別方法是否是鏈中的最後一個呼叫?PHP方法鏈 - 反映?
$instance->method1()->method2()->method3()->method4()
是否有可能使用返回對象實例的屬性來做同樣的事情?
$instances->property1->property2->property3->property4
$instances->property1->property2->property3->property4->method();
OR
$instances->property1->property2->property3->property4=some_value
至於第一個問題:沒有加入一些代碼來跟蹤你在哪裏鏈。
對於鏈接的方法,你可以使用PHP5的overloading methods(在這種情況下__call)。
我看不出有任何理由,你爲什麼會想跟蹤鏈接的屬性,但如果你堅持這樣的話,你可以使用__get上你的類重載方法來添加所需的功能。
請讓我知道,如果你不能弄清楚如何使用上述建議。
這似乎是迄今爲止最好的方法,儘管我仍然不明白爲什麼有人會想跟蹤鏈接方法/屬性調用的位置。 – 2009-08-04 16:34:11
debug_backtrace()是不會對使用的「流利接口」(爲「鏈」中所示的正確名稱)是正確的,因爲每一個方法返回,下一個被調用之前。
你是對的。修復了答案。感謝您指出這一點。 – 2009-07-24 16:00:13
我不認爲有對知道一個類時,它的最後一個方法調用被做了可行的途徑。我認爲你需要某種 - > execute();函數調用在鏈的末尾。
而且,在我看來,讓這樣的功能很可能使代碼過於神奇和驚喜的用戶和/或有馬車症狀。
這在某種程度上是我的意圖。 寫一個ORM,魔術絕對是菜單上的! – 2009-07-26 14:45:24
如果你所調用的所有方法都返回相同的對象來創建流暢的接口(而不是將不同的對象鏈接在一起),在對象本身中記錄方法調用應該是相當簡單的。
例如:
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');
這是我考慮的一種方法,雖然它將一些數據從返回的對象中移走,使得它不太具有內聚性。 主要的問題仍然是,我仍然無法確定何時處於鏈條末端。因此,我堅持有如下所示:「$ a-> f1() - > f2() - > f1() - > go();」觸發鏈條的結束。 – 2009-07-27 12:53:57
出於興趣,你能解釋一下你爲什麼要這樣做嗎?看起來有點奇怪,你想讓一個類知道如何從外部調用它的方法。 – 2009-07-24 15:52:08