PHP方法链 - 反映?

时间:2009-07-24 15:38:39

标签: php reflection properties methods method-chaining

是否有可能反映一系列方法调用,以确定您在调用链中的位置? 至少,是否可以辨别方法是否是链中的最后一次调用?

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

是否可以使用返回对象实例的属性来执行相同操作?

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

5 个答案:

答案 0 :(得分: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');

答案 1 :(得分:1)

对于链式方法,您可以使用PHP5的overloading methods(在这种情况下为__call)。

我没有看到任何你想要跟踪链接属性的原因,但是如果你坚持这样做,你可以在你的类上使用__get重载方法来添加所需的功能。

如果您无法弄清楚如何使用上述建议,请与我们联系。

答案 2 :(得分:1)

debug_backtrace()在使用“流畅的接口”(所示的“链接”的正确名称)方面不正确,因为每个方法在调用下一个方法之前返回。

答案 3 :(得分:0)

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

OR

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

关于第一个问题:并非没有添加一些代码来跟踪你在链中的位置。

答案 4 :(得分:0)

我不认为有一种可行的方法让一个类知道它的最后一个方法调用是什么时候进行的。我想你需要某种 - > execute();链末尾的函数调用。

此外,在我看来,启用此类功能可能会使代码过于神奇并让用户感到惊讶和/或出现错误症状。