是否可以反思一系列方法调用以确定您在调用链中的哪个点? 至少,是否有可能辨别方法是否是链中的最后一个呼叫?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