PHP方法链 - 反思?(PHP Method Chains - Reflecting?)

2019-09-20 17:23发布

是否可以反思方法的调用链,以确定你是在调用链有什么意义呢? 最起码,是可以辨别的方法是在链中的最后一次通话?

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

是否有可能做其使用性能相同返回对象的实例?

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

Answer 1:

如果所有的方法你调用都返回相同的对象创建流畅的界面(相对于链接不同的对象一起),它应该是相当琐碎记录对象本身的方法调用。

例如:

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');



Answer 2:

debug_backtrace()是不会对使用的“流利接口”(为“链”中所示的正确名称)是正确的,因为每一个方法返回,下一个被调用之前。



Answer 3:

对于链接的方法,你可以使用PHP5的重载方法 (在这种情况下__call)。

我看不出有任何理由,你为什么会想跟踪链接的属性,但如果你坚持这样的话,你可以使用__get上你的类重载方法来添加所需的功能。

请让我知道,如果你不能弄清楚如何使用上述建议。



Answer 4:

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

要么

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

至于第一个问题:没有加入一些代码来跟踪你在哪里链。



Answer 5:

我不认为有对知道一个类时,它的最后一个方法调用被做了可行的途径。 我认为你需要某种形式的 - >执行(); 在链的末端的函数调用。

另外,在我看来,让这样的功能很可能使代码过于神奇和惊喜的用户和/或有马车症状。



文章来源: PHP Method Chains - Reflecting?