【问题标题】:PHP Method Chains - Reflecting?PHP 方法链 - 反射?
【发布时间】:2023-04-03 03:10:01
【问题描述】:

是否有可能通过一系列方法调用来确定您在调用链中的哪个位置? 至少,是否有可能辨别一个方法是否是链中的最后一个调用?

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

是否可以使用返回对象实例的属性来做同样的事情?

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

【问题讨论】:

  • 出于兴趣,您能解释一下为什么要这样做吗?你想让一个类知道它的方法是如何被外部调用的,这似乎有点奇怪。

标签: php reflection properties methods method-chaining


【解决方案1】:

如果您调用的所有方法都返回 same 对象以创建流畅的接口(而不是将不同的对象链接在一起),那么将方法调用记录在对象本身。

例如:

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();”触发链的结束。
  • 对,我认为不会有任何方法可以自动检测“链的末端”。如果您尝试构建 SQL 查询(这是我最好的猜测,考虑到其他 cmets),那么在类中实现 __toString 魔术方法可以查看调用堆栈并生成最终的 SQL 字符串。这是 Zend Framework 中许多视图助手的实现方式。所以做 echo $a->f1()->f2()->f1(); (或任何其他导致种姓字符串的函数)将隐式调用 __toString() 方法 - 完成 go() 方法的工作。
【解决方案2】:

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

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

【讨论】:

  • 这是我目前的意图。编写 ORM,魔法绝对在菜单上!
【解决方案3】:

对于链式方法,您可以使用 PHP5 的 overloading methods(在本例中为 __call)。

我看不出您有任何理由要跟踪链式属性,但如果您坚持这样做,您可以在您的类上使用 __get 重载方法来添加所需的功能。

如果您不知道如何使用上述建议,请告诉我。

【讨论】:

  • 这似乎是迄今为止最好的方法,尽管我仍然不明白为什么有人会想要跟踪链式方法/属性调用的位置。
【解决方案4】:

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

【讨论】:

  • 你是对的。修正了答案。感谢您指出这一点。
【解决方案5】:
$instances->property1->property2->property3->property4->method();

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2022-11-27
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多