2009-07-24 54 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