【问题标题】:PHP chained method, how to know which is the last onePHP链式方法,如何知道哪个是最后一个
【发布时间】:2015-04-17 18:20:41
【问题描述】:

情况:

Class MyClass {
    ...
    public function method($args) {
        // code
        ...
        if (is the last call) {
            return $something;
        }
        return $this;
    }
    ...
}
....
$obj = new MyClass;
$obj->method($some_args)->method($something_else)->method($more_data);

我如何知道method 的最后一次通话是否真的是最后一次?

【问题讨论】:

  • 我不知道。你告诉我。什么调用了这段代码? $args 是否告诉我们这是最后一关?否则你的检查可能需要在调用它的地方执行。
  • 一般来说,函数应该负责知道这些信息。它们应该是独立的代码,只做好一件事。可能有一个答案会让你开心,但它几乎毫无疑问会让你的代码变得更糟。
  • 谢谢,没有真正的场景,所以 $args 和其他代码并不重要,这只是一个非常通用的情况。我在编写一个小型学习框架时考虑过这个问题

标签: php oop method-chaining method-call


【解决方案1】:

当一个函数被调用时,它始终是对该函数的最后一次调用。 PHP 不知道你的脚本是否真的会在那个之后执行另一个函数调用。

话虽如此,您可能可以使用 __destruct 魔术函数绕过,例如:

<?php

Class MyClass {
    private $method_queue = array();

    public function method($args) {
        array_push($this->method_queue, $args);
        return $this;
    }

    private function _method($args, $is_last) {
        // do actual stuff
        echo $args;

        if ($is_last) {
            echo "LAST";
            // do more stuff
        }
    }

    public function __destruct()
    {
        foreach ($this->method_queue as $k=>$args) {
            $this->_method($args, count($this->method_queue)-1==$k);
        }
    }
}

$obj = new MyClass;
$obj->method(1)->method(2)->method(3);

【讨论】:

  • 我讨厌这是一个如此巧妙的解决方案,因为使用它闻起来像个坏主意;)
  • 当然,方法名称可能更具描述性,但这完全取决于使用场景。我不认为使用 __destruct 本身是一个糟糕的解决方案,我不知道他的问题的背景是什么..
  • 在我看来,期望一个方法知道调用它的上下文而不传递一些东西来定义上下文是一种不好的做法。我并不是说您的示例具体是一个坏主意,我的意思是需要它表明可以更好地构建代码。
  • 是的,我完全同意
  • 谢谢,没有真实的场景,在编写一个小型研究框架时,我试图思考这样的动作是否可行,仅此而已......并且没有考虑这种做法是否可行好不好,我非常喜欢你的想法:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
相关资源
最近更新 更多